2016-05-24 11 views
0

をmultilogするスクリプトログをシェル:daemontoolsのは、私は、次のシェルスクリプトを持って

#!/bin/sh 
exec 2>&1 
echo "Starting ..." 
python /home/services/example.py 

Pythonスクリプトは、単にprintコマンドで構成されています。上記のスクリプトはdaemontoolsデーモンであり、単純なログ機構も有効です(multilog)。しかし、main/log/currentでは、 "Starting ..."という行は表示されていますが、pythonスクリプトの印刷されたコマンドは表示されません。

私は電話で何か間違っているのですか、何か忘れましたか?

EDIT私が実行しようとしています Pythonスクリプトは次のとおりです。繰り返し

sys.stdout.write("Hello world") 

を実行している

from time import sleep 
import sys 

sys.stdout.write("Hello World") 
print "Hello World" 

while 1: 
    sys.stdout.write("Hello world") 
    sleep(10) 
+0

例えば、 'sys.stdout'や' sys.stderr'に10秒ごとに書き込むPythonスクリプトを書くと、問題が再現されますか?そうでない場合、stderrがログに記録するかどうかを決める前にstderrがttyであるかどうかをチェックするスクリプトのような、もっと興味深いものがあるかもしれません。もしそうなら、これは再生または解決するプログラムの実行の詳細を調べる必要があります。 –

+0

[...別のところでは、手元の問題には本質的ではないので、 'exec python/home/services/example.py'とすることをお勧めします。 Pythonサービス、それを実行しているシェルではありません]。 –

+0

(もう一つの可能​​性は、出力がラインバッファリングされていないか、そうでなければフラッシュされていないということですが、そうであれば少し驚くかもしれませんが、まだ実行中のプログラムの詳細に依存します。助けてください)。 –

答えて

0

...ちょうどなしでフォームHello worldHello worldHello worldの単一の巨大なラインを作成しますそれがいつも洗うことを保証する。あなたはそれを書く任意のコンテンツの

入れの改行は(printを介して)暗黙的にそれらを持って、直接sys.stdout.write()を使用しているとき、あなたのバッファをフラッシュしません:

while 1: 
    sys.stdout.write("Hello world\n") # add a newline 
    sys.stdout.flush()     # flush the buffer 
+0

ありがとうございました。興味深いものも見た。最後に '\ n'で改行しただけで、実際にはすぐにstdoutに追加されます。それ以外の場合は '-d'シグナルを送信するときに追加されます。これは1行であるためです。 – Freddy

0

私も同じ問題に直面していました。

解決策は、出力バッファリングを無効にすることです。 -uフラグはPythonの出力のバッファリングを無効に

python -u /home/services/example.py 

:にスクリプトを実行して、あなたのdaemontoolsを更新し、あなたのケースではDisable output buffering

を参照してください。

関連する問題