나는 묶고 싶다사용자네트워크 이벤트에 대한 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에 더 쉽게 연결할 수 있는 모듈이 있습니다.