私はArch Linuxを実行しており、デバイスが接続されたらサービスを開始するudevルールがあります。この場合、3Gモデムに接続すると、接続に電話がかかります。
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"
ただし、systemdはデバイスが削除されてもサービスを停止しないため、再接続してもすでに実行されているため、サービスを開始しません。
私にとって必要なのは、サービスを停止するためにデバイスが削除されたときに実行される一致するudevルールです。
修正する
以下の答えを使って今持っているのは、次のudevルールです。
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"
次のサービスファイルを使用します(デフォルトではnetcfgサービスファイルからコピーして貼り付けます)。
[Unit]
Description=Netcfg networking service for Vodafone Dongle
Before=network.target
Wants=network.target
BindsTo=dev-gsmmodem.device
After=dev-gsmmodem.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/netcfg check-iface wvdial
ExecStop=-/usr/bin/netcfg down wvdial
KillMode=none
[Install]
WantedBy=multi-user.target
ダイヤルにAURを使用していますnetcfg-wvdial
。
答え1
あなたの問題はsystemdのみを使用して解決できます。サービスを指定します。必要またはより良い方法は、バインドする与えられたデバイス。
引用:
「他の[必須/制限]デバイスの1つが無効またはアクティブ化に失敗した場合、このデバイス[サービス]は無効になります。」
以下のようにサービスファイルを編集します。
[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device
注:利用可能なすべてのデバイスデバイスファイルのリストを取得するには、次のコマンドを使用します。systemctl list-units --all --full | grep ".device"