私の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
python3
whenの出力がそのパイプに入り、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