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


12

Arch Linuxを実行しています。デバイスを挿入するとサービスを開始するudevルールがあります。この場合、3Gモデムが接続されているときに接続にダイヤルします。

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

ただし、デバイスが削除された場合、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

netcfg-wvdialAURからダイヤルを使用しています。

回答:


11

systemdを単独で使用して問題を解決するには、サービスに指定のデバイスが必要か、さらにはBindsTo が必要であることを指定するだけです。

引用:

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

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

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

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


これは、udevルールが必要ないことを意味しますか?私はあなたが提案したように、netcfg @ wvdial.serviceを置き換える新しいサービスファイルを作成し、これらの2行を含めることで、実行しようとしました。現在はサービスを停止しているようですが、デバイスが再度接続されたときにサービスは開始されません。
crazystick 2013

@crazystickあなたはまだサービスを開始するためにudevルールを必要とします、私が意味したことはそれを停止するためにudevを使用する必要がないということです。
brunocodutra 2013

とった。udevルールと変更されたサービスファイルの両方で非常にうまく機能します。
クレイジースティック2013

2
あなたは使用することができますStopWhenUnneeded=true代わりBindsToAfter
SergA

@SergA私がこれに答えるまでに、動作するのを妨げるバグがあっStopWhenUnneeded=trueが、私はかなり長い間修正されていると信じている。
brunocodutra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.