systemd를 사용하여 USB 동글 연결 끊김 복구

systemd를 사용하여 USB 동글 연결 끊김 복구

이곳이 이 질문을 게시하기에 적합한 장소가 아니라면 그렇게 말씀해 주십시오.

저는 USB 동글 장치(안테나가 있는 CC2531, 안테나 모델을 잊음)와 Linux 시스템(KDE 네온 사용자 버전 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"을 다이얼아웃 그룹에 추가했습니다.

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

관련 정보