我有一个Python 脚本,我想在启动时运行它。然而,当我将它作为 systemd 服务运行时,它似乎无法找到其中一个模块。这是状态消息:
● 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'.
奇怪的是这个脚本从命令行运行不会失败。我什至让它作为 systemd 服务在另一台机器上运行。我的 .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
更改或其他环境变量设置都不会~/.bashrc
自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(读取man xhost
)。
可以在Read 文件cron
中为所有作业设置环境变量。crontab
man 5 crontab
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。