私は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が必要な場合は、より多くの情報を提供できます。これは、人々が「私は実行できますが、システムでは実行できません」という問題に直面する非常に一般的な理由です。