Pythonの出力印刷ステートメントはcronログには入力されません。

Pythonの出力印刷ステートメントはcronログには入力されません。

私のcrontabは次のようになります。

@reboot sh /home/pi/LCDinterface/shutdownlauncher.sh 2>&1 | tee -a /home/cronlog

コンテンツshutdownlauncher.sh:

cd /
cd home/pi/LCDinterface


date
python shutdown.py 
echo ''
cd /

コンテンツshutdown.py:

if interrupt_happens:
  print ("shutting down")
  time.sleep(3)
  os.system("sudo shutdown -h now")

実行または実行すると、python shutdown.py端末sh shutdownlauncher.shで常に「閉じる」という出力テキストを表示できます。ただし、cronだけがbashスクリプトの実行を開始すると、Pythonスクリプトが呼び出されます。私はそのテキストを見たことがなく、ログにも表示されません。 shスクリプトのコマンドはdate私のログには表示されますが、端末には表示されません。助けてください?shutdownlauncher.sh端末とログから出力を表示するためにタスクを編集またはクローンするにはどうすればよいですか?プロセス全体はRaspberry Pi 3で実行され、SSH経由で接続します。

マイログファイルの内容:

Fri Apr  7 19:26:33 CEST 2017
Fri Apr  7 19:36:11 CEST 2017
Fri Apr  7 21:18:45 CEST 2017
Sat Apr  8 00:08:09 CEST 2017
Sat Apr  8 00:29:31 CEST 2017
Sat Apr  8 10:08:17 CEST 2017
Sat Apr  8 11:58:35 CEST 2017

答え1

印刷機能の代わりにモジュールを試してくださいsyslog

import syslog
syslog.syslog('System is going to shutdown')

答え2

比較する:

python3 -c 'import time; print("foo"); time.sleep(1); print("bar")'

そして:

python3 -c 'import time; print("foo"); time.sleep(1); print("bar")' | cat

python3whenの出力がそのパイプに入り、foo最後barにのみ印刷されることがわかります。

または:

$ python3 -c 'import os, signal; print("foo"); os.kill(os.getpid(), signal.SIGTERM); print("bar")'
foo
zsh: terminated  python3 -c
$ python3 -c 'import os, signal; print("foo"); os.kill(os.getpid(), signal.SIGTERM); print("bar")' | cat
zsh: terminated  python3 -c  |
zsh: done        cat

ほとんどの言語と同様に、標準出力がユーザーが使用するために端末デバイスに送信されない場合は、あまりにも多くの不要な書き込みを実行する必要がないようにバッファリングされます。

shutdownこのスクリプトを含むすべてのプロセスは最終的に終了するため、バッファpythonはフラッシュされません。

次を呼び出す前に、標準出力バッファをフラッシュするようにshutdown明示的に要求できますkill

$ python3 -c 'import os, signal, sys; print("foo"); sys.stdout.flush(); os.kill(os.getpid(), signal.SIGTERM); print("bar")' | cat
foo
zsh: terminated  python3 -c  |
zsh: done        cat

しかし、ここでメッセージはstdoutの代わりにstderrに送信されなければならず、ttyデバイスに送信されなくてもstderrはバッファリングされません。

$ python3 -c 'import os, signal, sys; print("foo", file=sys.stderr); os.kill(os.getpid(), signal.SIGTERM); print("bar")' 2>&1 | cat
foo
zsh: terminated  python3 -c  2>&1 |
zsh: done        cat

関連情報