スクリプトをシステムサービスとして実行するにはどうすればよいですか?

スクリプトをシステムサービスとして実行するにはどうすればよいですか?

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デバイスのログ)でメッセージを探している場合は、フラッシュする前に十分なデータが印刷されるまで長い時間待つ必要があります。

これに対する簡単なテストは、-uPythonにオプションを追加して出力をバッファリングしないようにすることです。systemctl daemon-reloadサービスユニットファイルを編集した後にこれを実行することを忘れないでください。

strace実行中のPythonプロセスに接続を使用することもできます。ユーザーがfutexを待っていることはわかりますが、適切な時間が経過するとfutex呼び出しが返されることを確認してから再入力する必要があります。

おすすめ記事