web-dev-qa-db-ja.com

特定のUSBデバイス(イーサネットドングル)が接続されているときにsystemdサービスを開始するにはどうすればよいですか?

イーサネットアクセスに使用するUSB​​イーサネットドングルを持っていますが、接続時にnetctl-ifplugd@...を自動的に開始したいと思います(イーサネットケーブルの接続と混同しないでください) -それはnetctl-ifplugdによって処理されます。)どうすればこれを実現できますか?

私は見たことがあります 存在するデバイスに依存するsystemdサービスを作成する方法は? しかし、それはプラグインではなく、存在するだけのようです。

1
SoniEx2

「存在するデバイスに依存するsystemdサービスを作成する方法」を見てきました。しかし、それはプラグインではなく、存在しているだけのようです。

これは非常に似ていますが、反対の依存関係が必要なだけです。デバイスに応じてサービスの代わりに(またはそれに加えて)、仮想デバイスが必要ですサービスに依存する単位。

実際、リンクされた質問のtitleは一見反対のことを求めているように見えますが、スレッドの 受け入れられた回答 はすでに、デバイスがサービスを開始します(udev-ruleメソッド)。

ただし、exact。deviceユニット名がある場合は、systemdの依存関係を直接使用する方が簡単です。

正確なsysfsパスがわかっている場合:

たとえば、デバイスがsys-subsystem-net-devices-usb0.deviceであると判断したとします。 foo.device.d/*.confドロップインやfoo.device.wants/シンボリックリンク(たとえばmulti-と同じように機能する)など、そのユニットを拡張するさまざまな方法を使用できます(仮想であるにもかかわらず)。 user.target.wants /)。

  • サービスに[Install]構成を追加してから、systemctl enableを追加できます。

    [Install]
    WantedBy=sys-subsystem-net-devices-%i.device
    
  • または、systemctl add-wantsを使用して同じ結果を直接取得できます。

    # systemctl add-wants sys-subsystem-net-devices-usb0.device [email protected]
    
  • どちらの方法でも、ln -sを介して手動で作成できるシンボリックリンクが生成されます。

これは通常、ユーザーユニットでも同じように機能します。

部分的な名前(または他のプロパティの組み合わせ)のみがわかっている場合:

デバイスに一致するudevルールを記述し(正確なudevルール構文はここでは範囲外です)、ユニットを示すSYSTEMD_WANTS udevプロパティ(別名「デバイス環境変数」)を設定します。

ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb*", ENV{SYSTEMD_WANTS}+="netctl-ifplugd@%k.service"

すべての*.rulesファイルはアルファベット順に処理されるため、ルールがsystemd独自の「永続的なネットワークインターフェイス」ルールよりも遅く配置されていることを確認してください。

ENV{SYSTEMD_USER_WANTS}を使用する場合、これはユーザーユニットで機能します。


Udevを介してRUN+="/bin/systemctl start foo"を使用したくなるかもしれません。そうしないでください。ただし、そうする場合は、少なくともsystemctl --no-blockオプションを使用して、2つのコンポーネント間にデッドロックが発生しないようにします。

2
user1686

dev はあなたが見たいものです。ハードウェアが接続されているとき、接続されていないとき、状態の変化が発生したときなどにコマンドを実行できるようになります。トリガーを制御するためのさまざまな基準を指定することもできます(つまり、ストレージデバイスが接続されているとき、または特定のモデルから特定のメーカーなど)システム上の既存のルールは/etc/udev/rules.d/に表示されます。

1
blihp