システムサービスはPythonプロジェクトを開始できません。

システムサービスはPythonプロジェクトを開始できません。

私はPythonで書かれたプロジェクトをサーバー上で実行しようとしています。次のサービスファイルを作成しました。

[Unit]
Description=My bot service
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3.10 /home/path/to/bot.py
[Install]
WantedBy=multi-user.target

しかし、このコードは機能しません。サービスの状態を確認すると、以下が返されます。

● test.service - My bot service
     Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Fri 2022-10-21 08:16:07 UTC; 15s ago
    Process: 156695 ExecStart=/usr/bin/python3.10 /home/path/to/bot.>
   Main PID: 156695 (code=exited, status=1/FAILURE)

Oct 21 08:16:07 instance-1 systemd[1]: test.service: Scheduled restart job, restart coun>
Oct 21 08:16:07 instance-1 systemd[1]: Stopped My bot service.
Oct 21 08:16:07 instance-1 systemd[1]: names.service: Start request repeated too quickly.
Oct 21 08:16:07 instance-1 systemd[1]: test.service: Failed with result 'exit-code'.
Oct 21 08:16:07 instance-1 systemd[1]: Failed to start My bot service.

ロボット(/usr/bin/python3.10 /home/path/to/bot.py)を直接実行すると機能します。

単純なPythonスクリプトをサービスとして実行するときにも機能します。

プロジェクト内で問題の原因が何であるかを理解していません。構成ファイルにパラメーターを追加してもWorkingDirectory何も変更されませんでした。

ベストアンサー1

bot.py戻ってくる1

どの条件でこのコードを使用して終了できるかを確認するには、コードを確認する必要があります。

最初にすることは削除ですRestart=always。スクリプトが失敗して再起動し、再起動して試みを停止することがわかります。最初に失敗すると、今後成功しない可能性が高くなります。したがって、すべてが正しく機能するまで、この行はほとんど必要ありません。それがすることは、出力を汚染し、開発中に混乱を引き起こすだけです。これがなければ、systemctl status最後の数行しか得られませんstdout

次に私がしたことは、サービスを開始してログを確認することでした。

$ sudo systemctl start test.service
$ journalctl -u test.service --since "5 minutes ago"

これにより、何が起こっているのかをstdoutまたはstderrの手がかりを提供できます。異常な痕跡があるか具体的に確認してください。

ログに出力がない場合は、pythonバッファがフラッシュされる前に終了している可能性があります。使用されるpythonオプションは、出力が-uバッファリングされないことを保証します。

ExecStart=/usr/bin/python3.10 -u /home/path/to/bot.py

--user最後に、このロボットがウィンドウを作成し、GUIがある場合は特別な手順(バスまたは設定DISPLAY=環境で実行)を実行する必要があります。 GUIが必要な場合は、より多くの情報を提供できます。これは、人々が「私は実行できますが、システムでは実行できません」という問題に直面する非常に一般的な理由です。

おすすめ記事