縛りたいユーザーネットワークイベントの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.target
NetworkManager.service
network-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に簡単に接続できるモジュールがあります。