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

Zet*_*tor 8 systemd services network-interface systemd-timer connectivity

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

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

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

Fel*_*xJN 14

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

解释:

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

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

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

也就是说,您需要了解network-online.target定义网络是否已启动

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

局限性

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

范围:系统/用户

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

  • “Wants”也会让计时器尝试启动网络目标。您可以添加它,但我认为对于您的情况来说没有必要 - 因为我假设您总是默认启动网络。如果你的连接不稳定,你可能会想到类似“BindsTo=”的东西,即如果网络连接中断则停止计时器。有关相对依赖选项的更多详细信息,请参见:[服务单元配置](https://www.freedesktop.org/software/systemd/man/systemd.unit.html#) (2认同)