ユーザーレベルのシステムサービスをネットワークイベントにバインドする方法は?

ユーザーレベルのシステムサービスをネットワークイベントにバインドする方法は?

縛りたいユーザーネットワークイベントのsystemdタイマー(またはサービス)。たとえば、次のサービスを考えてみましょう。

[Unit]
Description=shows if connection changed

[Service]
Type=oneshot
Environment=DISPLAY=:0
ExecStart=notify-send "Network" "Status changed!"

ネットワーク起動/終了イベント時にこのユーザーサービスを強制的に実行するにはどうすればよいですか?私は尋ねたエマルジョン前に。ディレクティブを使用する必要があるようですがPartOf=、これにはどのターゲットを使用する必要がありますか?

~/.config/systemd/user/1 - このサービスは、スコープがユーザーレベルになるように定義しました。これはシステムターゲットに依存できないことを意味します。

2- 次のように定義するとシステムレベルサービス、このサービスを実行させる正しいフック(.target)は何ですか? WiFiスイッチを切り替えたときにシステムサービスを監視しました。そのイベントでのみNetworkManager-dispatcher.serviceトリガーされ、操作が完了した後は無効になります。だから頼ることができないようです。システムのWiFiをオフにしても、、、、、すべてロードnetwork.targetされて有効になっています。network-online.targetNetworkManager.servicenetwork-manager.service

ベストアンサー1

systemctl --userユーザーレベルのサービスが対話できるすべてのデバイスのリストを表示するには、他のパラメータなしで実行してください。同様のものを見つけることもできますsys-subsystem-net-devices-eno1.device

しかし、これがネットワーク状態の変化に反応する最善の方法ではないかもしれません。代わりに、/etc/NetworkManager/dispatcher.d/ネットワークイベントが発生したときにいつでも実行するスクリプトをそのサブディレクトリに配置できます。詳細については、DISPATCHER SCRIPTSこの章をお読みくださいman NetworkManager

または、rootアクセス権がまったくないユーザーレベルである必要がある場合は、システムD-Busに接続してNetworkManagerイベントを監視できます。次のように起動できます。

gdbus monitor --system --dest org.freedesktop.NetworkManager

そして、あなたの特定の要件に応じて完璧になりました。たとえば、org.freedesktop.NetworkManager.StateChangedイベントや特定の種類のイベントを探しているとします。org.freedesktop.NetworkManager.Connection.Active.PropertiesChanged

単純なシェルスクリプトではなく、PerlやPythonなどの高度なスクリプト言語を使用している場合は、D-Busに接続するのが適切なソリューションかもしれません。これらの言語には、D-Busに簡単に接続できるモジュールがあります。

おすすめ記事