私はRaspberry Pi(Stretch OS)で複数のPythonスクリプトがクラッシュするのを防ぎたいと思います。
これが防止するためにシステムファイルを実装したのか明確にしたいと思います。多くの種類 Pythonスクリプトの競合を避けてください。サービスファイルのサービスセクションでは、一般的な形式は次のとおりです。
[Service]
ExecStart=/path/too/script
Restart=always
でも走ってるからいくつかのシルクヘビスクリプトを書くには、パスの前に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.
上記のコードをどのように修正して正しく機能させることができますか?また、Pythonライブラリにパスを追加する必要がありますかPYTHONPATH=/home/pi/.local/lib/python2.7/site-packages
?
私はLinux環境に初めて触れました。
答え1
お客様のサービスは次のように定義されます。
[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
、正しい形式を管理することが実行可能ファイルの使命です。
Python関連の環境変数(ユーザーなど)はPYTHONPATH
まったく意味がありません。systemd
〜しなければならない毎回、サービス定義の実行可能ファイルへの絶対パスを指定します。
通常、Pythonインタプリタの絶対パスはありますが、/usr/bin/python
次のことがわかります。
$ type python
python is /usr/bin/python
したがって、サービス定義は次のようにする必要があります。
[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always
systemdの非常に便利な紹介はここで見つけることができます。 Telegram ボットを Python スクリプトとして実行して維持します。