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環境に本当に慣れていないので、これに関するアドバイスをいただければ幸いです。
サービス定義は次のようになります。
[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