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

関連情報