답변:
Upstart 1.4 이상을 사용하는 경우 console log
Upstart 작업을 시작하면 stdout / stderr에 대한 모든 출력이로 종료됩니다 /var/log/upstart/<job>.log
. 그런 다음 tail -f /var/log/upstart/<job>.log &
터미널에 출력이 나타나도록 할 수 있습니다 .
/var/log/upstart
. 정말 유용합니다. 감사합니다.
Upstart Cookbook 에는 디버깅 기술에 대한 전체 섹션이 있습니다 . 가장 쉬운 방법은 --debug
커널 인수에 추가 하는 것입니다. 그러면 시동의 세부 정보가 증가하고 모든 것이 syslog에 덤프됩니다. 예, 디버깅은 복잡합니다. 병렬화 된 init 시스템을 만드는 데 필요한 순 복잡성을 반영합니다. 개선의 여지가 있다고 확신합니다.
파이썬 데몬을 쓸 때 모든 예외를 포착하고 로그 파일에 던집니다. 나는 디버그뿐만 아니라 프로덕션에서도 사용합니다. 나는 매일 아침 실행되는 작은 스크립트가있어 로그에서 무언가를 화나게합니다.
물론 데몬을 계속 실행하는 데 도움이됩니다.
일부 샘플 코드 (흥미롭지 않은 부분은 제거) :
import logging
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
filename=LOG_FILE,
filemode='w')
logging.info("Sincrod inicializado")
if not DEBUG:
daemonize()
while True:
try:
actua()
except:
logging.error(sys.exc_info())
if (datetime.datetime.now().hour > NOITE_EMPEZA\
and datetime.datetime.now().hour < NOITE_REMATA):
time.sleep(INTERVALO_NOITE)
else:
time.sleep(INTERVALO_DIA)
여기서 actua ()는 실제 데몬입니다 (로그에도 기록합니다). 또한 설정 파일에 DEBUG 변수가 있으며, True 일 때 데몬을 포크하지 않으므로 콘솔에서 실행됩니다.
데몬
데몬은 Windows 서비스와 유닉스에 해당합니다. 다른 프로세스와 독립적으로 백그라운드에서 실행되는 프로세스입니다. 그것은 그들의 아버지가 일반적으로 init이고 그들이 어떤 tty로부터 분리되어 있음을 의미합니다. 독립적이기 때문에 출력을 넣을 사전 정의 된 장소가 없습니다.
데몬을 만드는 데는 파이썬 라이브러리와 스 니펫이 많이 있습니다. 위의 예에서는 Steinar Knutsens와 Jeff Kunces 버전의 아이디어를 결합한 고유 한 기능을 사용합니다. 가능한 한 간단합니다 . 두 번 포크 합니다.
def daemonize():
"""Forks this process creating a daemon and killing the original one"""
if (not os.fork()):
# get our own session and fixup std[in,out,err]
os.setsid()
sys.stdin.close()
sys.stdout = NullDevice()
sys.stderr = NullDevice()
if (not os.fork()):
# hang around till adopted by init
ppid = os.getppid()
while (ppid != 1):
time.sleep(0.5)
ppid = os.getppid()
else:
# time for child to die
os._exit(0)
else:
# wait for child to die and then bail
os.wait()
sys.exit()