Shell-Script

使用 systemd 從 USB 加密狗斷開連接中恢復

  • July 25, 2020

如果這不是發布此問題的正確位置,請說。

我在 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)

感謝這篇文章中的 DrTron ,我找到了解決此問題的正確方法,即將使用者添加到對 USB 設備具有權限的組中。

如果其他人感興趣,我已將我的使用者“gal”添加到撥出組中

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

引用自:https://unix.stackexchange.com/questions/599790