我用来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