如何使系统计时器依赖于互联网连接?

如何使系统计时器依赖于互联网连接?

我用来systemd-timer定期运行一个消耗网络服务的脚本。
问题是,在系统恢复或唤醒时,互联网连接不会立即启动,但计时器会被触发,因此脚本返回错误(如果服务等待几秒钟,脚本将正确运行,并且会出现无需将任务推迟到下次运行。)

1-如何使计时器(或与其关联的服务)等待网络连接可用?

2-当系统尚未上线时,如何使计时器(或服务)不调用脚本?

答案1

添加After=network-online.target[Unit]计时器部分。

解释:

[Unit]定时器确实接受服务部分中已知的所有相关排序命令。事实上,定时器和服务的[Unit]和部分是相同的。[Install]形式官方手册:

名称以“.timer”结尾的单元配置文件编码有关由 systemd 控制和监督的计时器的信息,用于基于计时器的激活。

本手册页列出了特定于此单元类型的配置选项。看系统单元(5)所有单元配置文件的通用选项。通用配置项在通用的[Unit]和[Install]部分中配置。定时器特定的配置选项在 [Timer] 部分中配置。

这就是说你需要了解网络在线.target定义网络是否是向上

network-online.target 是主动等待网络“up”的目标,其中“up”的定义由网络管理软件定义。通常它表示某种已配置的、可路由的 IP 地址。其主要目的是主动延迟服务的激活,直到网络建立为止。

局限性

network-online.target没有检查互联网但对于网络连接。当然,局域网本身可能无法访问互联网。如果您不能依赖路由器或您的 ISP 来提供连接,则您必须制作一个特殊的test-internet.service协议来 ping 某些网站,并且仅在成功一次后才定义为活动状态(否则每 15 秒左右就会在失败时重新启动)。这应该是一种Type=oneshot服务RemainAfterExit=yes。但我认为这不是您所要求的。

范围:系统/用户

小心点,network-online.target就像系统范围单位。单位在用户作用域不会看到它并且无法启动。这可以通过创建链接单元来解决:systemctl --user link /lib/systemd/system/network-online.target。路径可能会有所不同,可以通过运行以下命令来检查位置:systemctl show --property FragmentPath network-online.target

相关内容