web-dev-qa-db-ja.com

systemdでサービスを停止するudevルールを作成する正しい方法は何ですか

私は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を使用してダイヤルしています。

12
crazystick

問題はsystemdのみを使用して解決できます。サービスを Requires またはさらに良いことは BindsTo 指定されたデバイスに指定するだけです。

引用:

"他の[必須/バインド先]ユニットの1つが非アクティブ化されるか、そのアクティブ化が失敗した場合、このユニット[サービス]は非アクティブ化されます"

次のようにサービスファイルを編集するだけです。

[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

注:使用可能なすべてのデバイスユニットファイルのリストを取得するには、systemctl list-units --all --full | grep ".device"を使用します

11
brunocodutra