ネットワークインターフェイスが開いたり閉じたりすると、Systemdサービスが実行されます(eth0)。

ネットワークインターフェイスが開いたり閉じたりすると、Systemdサービスが実行されます(eth0)。

eth0が起動/中断されるたびにシステムサービスを実行したいと思います(別の稼働/中断サービスかもしれません)。この値は、イーサネットが接続されているときに変更する必要があります。誰でもこれを達成する方法を知っていますか?

X秒ごとにポーリングするbashスクリプトを書くことができますが、それはおそらく私が望むよりも多くのCPUを消費し、実装がきれいではないかもしれません。

どんな提案でも歓迎します。ありがとうございます!

答え1

イーサネット稼働/中断イベント(およびその他)は、netlinkソケットを介してカーネルによって報告されます。ip monitorポーリングを避けるために、シェルスクリプトで使用できるメッセージを使用してメッセージを表示できます。

また、Debianには少なくとも1つのパッケージがあることがわかりました。ネットワークプラグは、netlinkメッセージを受信し、リンクの追加、アップリンク、およびダウンリンクでシェルスクリプトを実行するデーモンプロセスです。その後、シェルスクリプトを使用してsystemctlデバイスを起動/停止できます。

(おそらく、ネットワーク管理者とsystemd-networkdもこれらのイベントを受け取り、スクリプトをリンクする方法があるかもしれませんが、使用していないようです)。

答え2

UBUNTUサーバーでは、次のようにしてwlp3S0(WLAN)インターフェースに依存するHostapdサービスを作成しました。

[Unit]
Wants=network-online.target
BindsTo=sys-subsystem-net-devices-wlp3s0.device
After=sys-subsystem-net-devices-wlp3s0.device
Requires=systemd-networkd.socket
After=systemd-networkd.socket
After=network-online.target

答え3

ServerFaultに関するこの質問について[Install]ソリューションの表現は、カスタムサービスセクションに1行を追加するのと同じくらい簡単です。

[Install]
WantedBy=<the appropriate device unit>.device

一方、システムネットワーク接続がオンラインである間にサービスを開始したい場合、どのタイプのネットワーク接続に関係なくその後、systemdバージョンに関連するman systemd.special使用説明書を確認してお読みください。network-online.target私のシステムのsystemdバージョンに推奨されるステップは、それをサービスに追加することです。

[Unit]
Wants=network-online.target
After=network-online.target

...しかし、ここではsystemdのバージョンによって異なる指示が表示されているようですので、まず配布を確認してくださいman systemd.special

関連情報