起動時に実行したいPythonスクリプトがあります。ただし、システムサービスとして実行すると、モジュールの1つが見つからないようです。ステータスメッセージは次のとおりです。
● mqttproc.service - MQTT Post-processor
Loaded: loaded (/etc/systemd/system/mqttproc.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2021-12-06 11:10:45 GMT; 2min 31s ago
Process: 2375 ExecStart=/usr/bin/python3 /home/ken/python/mqttproc/mqttproc.py (code=exited, status=1/FAILURE)
Main PID: 2375 (code=exited, status=1/FAILURE)
Dec 06 11:10:45 MintVM systemd[1]: Started MQTT Post-processor.
Dec 06 11:10:45 MintVM python3[2375]: Sensor positions [100.0, 80.0, 60.0, 40.0, 20.0, 0.0] (Litres)
Dec 06 11:10:45 MintVM python3[2375]: Traceback (most recent call last):
Dec 06 11:10:45 MintVM python3[2375]: File "/home/ken/python/mqttproc/mqttproc.py", line 131, in <module>
Dec 06 11:10:45 MintVM python3[2375]: import paho.mqtt.client as mqtt
Dec 06 11:10:45 MintVM python3[2375]: ModuleNotFoundError: No module named 'paho'
Dec 06 11:10:45 MintVM systemd[1]: mqttproc.service: Main process exited, code=exited, status=1/FAILURE
Dec 06 11:10:45 MintVM systemd[1]: mqttproc.service: Failed with result 'exit-code'.
奇妙なことは、このスクリプトをコマンドラインで実行しても失敗しないことです。他のコンピュータでシステムサービスとして実行した。私の.serviceファイルはとても簡単です。
[Unit]
Description=MQTT Post-processor
[Service]
ExecStart=/usr/bin/python3 /home/ken/python/mqttproc/mqttproc.py
WorkingDirectory=/home/ken/python/mqttproc
[Install]
WantedBy=multi-user.target
誰もが私が逃した明白な点を指摘できますか?
よろしくお願いします。
答え1
ジョブがによって実行されているcron
か、systemd
起動スクリプトがデスクトップで実行されているのと同じランタイム環境で実行されていません。systemd
でスクリプトを起動しますroot
。変更やその他の環境変数の設定は、ジョブに自動的に伝播されPATH
ません。たとえば、noなので、GUIプログラムには特別な処理(読み取り)が必要です。~/.bashrc
cron
$DISPLAY
man xhost
cron
環境変数は、すべてのジョブの読み取りファイルで設定できます。crontab
man 5 crontab
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
各環境の結果を確認してください。