如何将用户级 systemd 服务绑定到网络事件?

如何将用户级 systemd 服务绑定到网络事件?

我想绑定一个用户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.targetnetwork-online.targetNetworkManager.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 连接的模块。

相关内容