Ubuntu systemctl 服务失败,并显示:主进程已退出,代码=已退出,状态=1/FAILURE

Jaz*_* He 7 python ubuntu systemctl mqtt

我正在编写一个 python 脚本,该脚本向本地主机 MQTT 代理订阅一些 MQTT 主题,当推送消息时,该脚本将调用同一目录中另一个脚本中的函数,以将更改加载到 SQL 数据库中。

\n

在终端中手动运行时,该脚本工作正常:

\n

python3 /directory/path/to/file/listen_mqtt.py

\n

但是,我试图让这个文件在 Ubuntu 系统启动时自动执行。我在以下位置创建了一项新服务:

\n

/lib/systemd/system/listen_mqtt_py.service

\n

服务描述如下:

\n
[Unit]\nDescription=Listen Mqtt\nAfter=mosquitto.service\nWants=network.target\nConflicts=getty@tty1.service\n\n[Service]\nType=simple\nExecStart=/usr/bin/python3 /home/bt/dev/dexter-mqtt-to-sql/listen_mqtt.py\nStandardInput=tty-force\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

我还启用了该服务并尝试使用以下命令启动该服务:

\n

sudo systemctl enable listen_mqtt_py.service

\n

\n

sudo systemctl start listen_mqtt_py.service

\n

重新启动计算机并尝试手动运行该服务时,我收到以下消息:

\n
sudo systemctl status listen_mqtt_py.service\n\xe2\x97\x8f listen_mqtt_py.service - Listen Mqtt\n     Loaded: loaded (/lib/systemd/system/listen_mqtt_py.service; enabled; vendor preset: enabled)\n     Active: failed (Result: exit-code) since Tue 2020-11-17 13:45:28 AEDT; 14s ago\n    Process: 2206 ExecStart=/usr/bin/python3 /home/bt/dev/dexter-mqtt-to-sql/listen_mqtt.py (code=exited, status=1/FAILURE)\n   Main PID: 2206 (code=exited, status=1/FAILURE)\n\nNov 17 13:45:27 btdms systemd[1]: Started Listen Mqtt.\nNov 17 13:45:28 btdms systemd[1]: listen_mqtt_py.service: Main process exited, code=exited, status=1/FAILURE\nNov 17 13:45:28 btdms systemd[1]: listen_mqtt_py.service: Failed with result 'exit-code'.\n
Run Code Online (Sandbox Code Playgroud)\n

我做了一些研究,发现这种类型的错误可能与在加载某些所需设备之前过早调用服务有关。因此,我尝试更改After=tonetwork-online.target和 to mosquitto.service,但是没有运气,服务仍然退出并显示相同的错误消息。

\n

因为即使我手动运行该服务也没有完全执行sudo systemctl start listen_mqtt_py.service,所以我怀疑这不是由于另一个服务没有及时加载造成的。这是其他一些原因。但我不明白为什么。

\n

如果需要的话,我很高兴也发布 python 脚本listen_mqtt.py

\n

谢谢。

\n

Jaz*_* He 11

事实证明,这是由于 python 包的用户权限造成的。可以在此处找到诊断此问题的方法。

让我们找到无法启动的systemd服务

$ systemctl --failed
Run Code Online (Sandbox Code Playgroud)

发现 systemd-modules-load 服务存在问题。我们想了解更多。

$ systemctl status systemd-modules-load  
Run Code Online (Sandbox Code Playgroud)

如果需要重新生成失败消息,请重新启动服务

$ systemctl restart systemd-modules-load
Run Code Online (Sandbox Code Playgroud)

现在获得的PID:

journalctl _PID=15630
Run Code Online (Sandbox Code Playgroud)

或者

journalctl _SYSTEMD_UNIT=systemd-modules-load.service
Run Code Online (Sandbox Code Playgroud)

您应该能够看到失败时生成的错误消息。查看错误消息,我们知道该paho包尚未正确导入。

解决方案

A。使用root安装相关的python包(这就是我最终所做的)

进入根 CLI

sudo su -
Run Code Online (Sandbox Code Playgroud)

b. 为服务中所需的 python 包授予 root 权限,我没有这样做,因为我不确定它与其他用户的行为方式,并且我不确定 root 是否需要比仅包更多的权限。有关此问题的讨论可以在这里找到。