使用 systemd 从 USB 加密狗断开连接中恢复

使用 systemd 从 USB 加密狗断开连接中恢复

如果这不是发布此问题的正确位置,请说出来。

我在 USB 加密狗设备(带天线的 CC2531,忘记天线型号)和 Linux 机器(KDE neon 用户版 5.19,基于 Ubuntu 18.04)上运行 zigbee2mqtt(Zigbee 代理)。有时 zigbee2mqtt 停止工作,我必须更改设备的所有权(使用 chown)才能再次成功运行它。所以我把它放在一个脚本中:

~/my_services/zigbee2mqtt_service $ cat z2m.sh 
sudo chown gal /dev/ttyACM0
cd /opt/zigbee2mqtt
npm start

并在 systemd 中创建一个服务来运行脚本:

~/my_services/zigbee2mqtt_service $ systemctl cat zigbee2mqtt.service 
# /etc/systemd/system/zigbee2mqtt.service
[Unit]
Description=zigbee2mqtt
After=network.target
[Service]
# ExecStart=/usr/local/bin/npm start
# WorkingDirectory=/opt/zigbee2mqtt
ExecStart=/home/gal/my_services/zigbee2mqtt_service/z2m.sh
StandardOutput=inherit
StandardError=inherit
Restart=always
User=gal
[Install]
WantedBy=multi-user.target

这曾经有效,但由于某种原因,现在该服务无法启动。我尝试启用它、手动启动并重新加载守护进程。如果我手动运行 z2m.sh 脚本,它运行良好,但我正在远程计算机上工作,因此我必须断开连接,这会停止 zigbee2mqtt。

如果您能指出要修复的内容,或者从“撤销的所有权”中恢复的不同方式,那就太好了。

编辑:这是我在检查服务状态时得到的信息:

~ $ systemctl status zigbee2mqtt.service 
● zigbee2mqtt.service - zigbee2mqtt
   Loaded: loaded (/etc/systemd/system/zigbee2mqtt.service; enabled; vendor pres
   Active: failed (Result: exit-code) since Mon 2020-07-20 11:00:57 IDT; 2 days 
  Process: 4059 ExecStart=/home/gal/my_services/zigbee2mqtt_service/z2m.sh (code
 Main PID: 4059 (code=exited, status=203/EXEC)

Jul 20 11:00:57 phoenix systemd[1]: zigbee2mqtt.service: Service hold-off time o
Jul 20 11:00:57 phoenix systemd[1]: zigbee2mqtt.service: Scheduled restart job, 
Jul 20 11:00:57 phoenix systemd[1]: Stopped zigbee2mqtt.
Jul 20 11:00:57 phoenix systemd[1]: zigbee2mqtt.service: Start request repeated 
Jul 20 11:00:57 phoenix systemd[1]: zigbee2mqtt.service: Failed with result 'exi
Jul 20 11:00:57 phoenix systemd[1]: Failed to start zigbee2mqtt.
lines 1-12/12 (END)

答案1

感谢 DrTron 在这个帖子,我找到了解决此问题的正确方法,即将用户添加到有权访问 USB 设备的组中。

如果其他人感兴趣,我已将我的用户“gal”添加到 dialout 组中

sudo adduser gal dialout

然后,systemd 服务只需要关心 zigbee2mqtt,所以我将服务更改为:

$ systemctl cat zigbee2mqtt.service 
# /etc/systemd/system/zigbee2mqtt.service
[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/local/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=gal

[Install]
WantedBy=multi-user.target

最后,我注销并登录并使用新配置启动服务。

$ systemctl daemon-reload
$ systemctl start zigbee2mqtt.service

相关内容