pythonスクリプトの競合を防ぐためにsystemdを使用する

pythonスクリプトの競合を防ぐためにsystemdを使用する

私は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 スクリプトとして実行して維持します。

おすすめ記事