web-dev-qa-db-ja.com

systemdを使用してpythonスクリプトがクラッシュしないようにする

Raspberry Pi(Stretch OS)で複数のpythonスクリプトがクラッシュしないようにしたい。

multiplepythonスクリプトがクラッシュするのを防ぐためにこれがsystemdファイルを実装する方法であるかどうかを明確にしたかったのです。サービスファイルのサービスセクションでは、一般的な形式は次のとおりです。

[Service]
ExecStart=/path/too/script
Restart=always

しかし、私は複数のpythonスクリプトを実行しているので、パスの前にpythonを追加し、サービスセクションを積み重ねる必要があると思います。私が間違っている場合は訂正してください。

私の現在のスクリプト(constantrun.service)は次のとおりです。

[Unit]
Description='python scripts that needs to be run constantly'

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script2.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script3.py
Restart=always

[Install]
WantedBy=multi-user.target

ただし、実行するときは、このサービスファイルをSudo systemctl start constantrun.serviceで開始してみてください。次のエラーが発生します。

Failed to start constantrun.service: Unit constantrun.service is not loaded properly: Invalid argument.
See system logs and 'systemctl status constantrun.service' for details.

ログを開くと、次のように表示されます。

● constantrun.service - 'python scripts that needs to be run constantly'
   Loaded: error (Reason: Invalid argument)
   Active: inactive (dead)

Feb 18 17:15:12 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:15:12 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:17 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:33 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.

上記のコードを変更して機能させるにはどうすればよいですか?また、PYTHONPATH=/home/pi/.local/lib/python2.7/site-packagesなどのpythonライブラリへのパスを追加する必要がありますか?

私はLinux環境に本当に慣れていないので、これに関するアドバイスをいただければ幸いです。

1
Craver2000

サービス定義は次のようになります。

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always

そして、これはそれらのそれぞれのエラーメッセージです:

Executable path is not absolute, ignoring: python /home/pi/...

systemdの場合、このサービス定義の「実行可能ファイル」はpythonであり、これは明らかに絶対パスではありません。 /home/pi/projects/script1.pyはこのpython実行可能ファイルへの単なる引数であり、その適切な形式を気にすることは実行可能ファイルの仕事です。

PYTHONPATHのようなPython固有の環境変数は、systemdにはまったく意味がありません。あなた必須サービス定義で実行可能ファイルの絶対パスを指定します。毎回。

通常、pythonインタプリタへの絶対パスは/usr/bin/python、しかしあなたはチェックすることができます:

$ type python
python is /usr/bin/python

したがって、サービス定義は次のようになります。

[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always
1
telcoM