回答:
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
方法は、カーネル引数に追加することです。これにより、upstartの冗長性が高まり、すべてがsyslogにダンプされます。はい、デバッグは複雑です。これは、並列化されたinitシステムを作成するために必要な正味の複雑さを反映しています。改善の余地があると確信しています。
pythonデーモンを作成すると、すべての例外をキャッチして、ログファイルにスローします。デバッグだけでなく、本番でも使用しています。毎朝実行する小さなスクリプトがあり、ログに動揺する何かを探します。
もちろん、デーモンを実行し続けるのにも役立ちます。
いくつかのサンプルコード(面白くない部分を削除します):
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サービスに相当するUNIXです。これらは、他のプロセスから独立したバックグラウンドで実行されるプロセスです。つまり、彼らの父親は通常initであり、どのttyからも切り離されています。それらは独立しているため、出力を配置するための事前定義された場所はありません。
デーモンを作成するためのPythonライブラリとスニペットがたくさんあります。上記の例では、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()