사용자 수준 시스템 서비스를 네트워크 이벤트에 바인딩하는 방법은 무엇입니까?

사용자 수준 시스템 서비스를 네트워크 이벤트에 바인딩하는 방법은 무엇입니까?

나는 묶고 싶다사용자네트워크 이벤트에 대한 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.

또는 루트 액세스 권한이 전혀 없는 사용자 수준이어야 하는 경우 시스템 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에 더 쉽게 연결할 수 있는 모듈이 있습니다.

관련 정보