X分ごとに実行したい関数を含むPythonスクリプトがあります。
from threading import Timer
x = 5
def control():
Timer(x*60, control).start()
rest_of_the_function()
control()
端末のPython仮想環境でスクリプトを実行しても問題はありません。システムサービスとして実行すると、control()
関数は一度だけ呼び出され、他の操作は実行されません。
systemctl status myservice
サービスを通じて確認してみるとポジティブ現場で話す活動(実行)。ログにエラーがありません。
/lib/systemd/system/myservice.service ファイルの内容は次のとおりです。
[Unit]
Description=Short description
[Service]
Type=simple
WorkingDirectory=/home/user/myservice
ExecStart=/home/user/myservice/myvenv/bin/python main.py
[Install]
WantedBy=multi-user.target
なぜ一度だけ呼び出されますかcontrol()
?修正できますか?
答え1
単純なバッファリングの問題があるようです。 stdout(デフォルトではsystemdデバイスのログ)でメッセージを探している場合は、フラッシュする前に十分なデータが印刷されるまで長い時間待つ必要があります。
これに対する簡単なテストは、-u
Pythonにオプションを追加して出力をバッファリングしないようにすることです。systemctl daemon-reload
サービスユニットファイルを編集した後にこれを実行することを忘れないでください。
strace
実行中のPythonプロセスに接続を使用することもできます。ユーザーがfutexを待っていることはわかりますが、適切な時間が経過するとfutex呼び出しが返されることを確認してから再入力する必要があります。
答え2
print()
別の書き込みファイル記述子(ファイル、パイプなど)を使用するときにflush()
すぐに出力が必要な場合は、バッファをフラッシュする必要があります。
または標準入力、標準出力そして標準エラー-u
Pythonで説明されているオプションを使用して、バッファリングされていないモードを使用できます。マニュアルページ。