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