systemdを使用してPythonスクリプトをサービスとして実行します。

systemdを使用してPythonスクリプトをサービスとして実行します。

私はDebian 8 VPSを受け取り、Pythonスクリプトをサービスとして実行しようとしています。次のように書きました(すべての操作はrootとしてログインしたSSHを介して行われます)。

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1

[Install]
WantedBy=multi-user.target

私はそれを入れて/lib/systemd/system からchmodedしました。

chmod 644 /lib/systemd/system/cmcreader.service

その後、次を使用して有効にします。

systemctl daemon-reload
systemctl enable cmcreader.service

ただし、最後のコマンドは(enable)を返します。

Failed to execute operation: Invalid argument

私は何が間違っていましたか?ありがとうございます。

答え1

ここでは、man systemd.directivesすべてのsystemdディレクティブのドキュメントを見つけることができます。ここでExecStart=文書の内容を見つけることができますman systemd.service

そこのドキュメントには次のように記載されています。

"<"、"<<"、"">"、および">>"を使用したリダイレクト、"|"を使用したパイプ、"&"を使用したバックグラウンドでのプログラム実行、およびその他のシェル構文要素はサポートされていません。

一般的には必要ありません。systemdアプリケーションはデフォルトですでにバックグラウンドで実行されているため、必要はありません&。また、出力を自動的にSTDOUTおよびSTDERRにキャプチャして記録するため、出力をログファイルにリダイレクトする必要もありません。

journalctl -u cmcreaderサービスのログを表示するか、journalctlすべてのログを表示するためにのみ使用してください。

システムファイルの構文がわからない場合は、次のものを使用できます。

systemd-analyze verify ./path/to/your.service

また、作成したサービスファイルも/etc/systemd/system。この/libディレクトリは、手動ではなくパッケージとしてインストールされたサービスファイルを保存するために使用されます。

最後に、enableサービスを起動するのではなく、起動時にアプリケーションを起動するように[Install]設定する部分のみを実行します。

サービスを開始するにはを使用しますsystemctl start your.service

答え2

問題は、シェルリダイレクト演算子を使用しようとしていることです。 systemd はシェルで ExecStart 行を暗黙的に実行しません。

それがすることは、ユーザーが指定したプログラム(/usr/bin/python例では)を実行することだけであり、他のすべてはそのプログラムのパラメータです。> /web/cmcreader/test.log 2>&1セクションによって無効な引数エラーが発生します。はいPythonの引数が間違っています。

@mark-stosbergの答えに従って、単にJournalctlを使用し、リダイレクト内のすべてのエントリを削除することをお勧めします。本物Pythonスクリプトをファイルに書き込むには、いくつかのオプションがあります。

  • 実際にログファイルに書き込むようにPythonを再構築してください。
  • Pythonスクリプトを実行して出力をリダイレクトするbashスクリプトをシステムで実行しました。
  • systemd が bash を明示的に実行できるようにするExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"

もう一度言いますが、私はこれらのオプションをあまりお勧めしません。特に最後のオプションはさらにそうです。

関連情報