Shell-Script
使用 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)
感謝這篇文章中的 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