我想绑定一个用户systemd 计时器(或服务)到网络事件。例如考虑这个服务:
[Unit]
Description=shows if connection changed
[Service]
Type=oneshot
Environment=DISPLAY=:0
ExecStart=notify-send "Network" "Status changed!"
如何强制此用户服务在网络启动/关闭事件上运行?我问了一个类似的问题之前。看来我应该使用PartOf=
指令,但是我应该为此使用什么目标?
1- 请注意,我已经定义了此服务,~/.config/systemd/user/
因此其范围是用户级别的。这意味着它不能依赖于系统目标。
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 等更高级的脚本语言,而不仅仅是 shell 脚本,那么连接到 D-Bus 可能是合适的解决方案;这些语言具有可以更轻松地与 D-Bus 连接的模块。