防止 systemd 计时器在启动时运行

bit*_*oob 3 cron systemd systemd-timer

我一直在将我的 crontab 迁移到 systemd 的计时器单元。它们看起来都类似于:

.timer 文件:

[Unit]
Description=timer that uses myjob.service

[Timer]
OnCalendar=*-*-* *:00:00
Unit=myjob.service

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

.service 文件:

[Unit]
Description=Script that runs myjob.sh

[Service]
ExecStart=/home/user/myjob.sh
Run Code Online (Sandbox Code Playgroud)

我的计时器可以工作,但它们也会在系统重新启动时执行。我希望我的 OnCalendar 事件只在指定的时间运行,而不是在我重新启动 PC 的任何随机时间运行。有任何想法吗?


更新:我通过将我的“用户”计时器转换为根/系统计时器解决了这个问题。

  1. 我禁用了所有 .service 和 .timer 文件,并将它们从我的主目录中移到 /etc/systemd/system 中。

  2. 我在每个服务文件中添加了“用户 =”部分,以便我的脚本由普通用户而不是 root 用户运行。

现在我的计时器没有在系统启动时被触发,当我通过 ssh 登录时,我也遇到了偶发触发的问题。现在这也已解决,因为它们受 root 帐户的控制,但运行我的脚本仍然作为普通用户的 PID 运行,这保留了我的文件的所有权属性。问题解决了。

小智 6

我也遇到了同样的问题,无法弄清楚为什么无论Persistent.timer 文件中的设置如何,单元总是在启动时运行,我花了一段时间但我终于找到了原因(@alexander-指出了正确的方向)托尔卡乔夫的评论)。

问题是我总是WantedBy=basic.target在 .service 文件的 [Install] 部分包含类似的内容(因为它是标准 systemd 服务复制面食的一部分)。事实证明,这实际上会导致只要 basic.target 是(又名系统启动),就会启动该单元。

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#WantedBy= https://www.freedesktop.org/software/systemd/man/systemd.special.html#basic.target

我怀疑 OP 通过禁用旧的 .service(您必须这样做才能删除由 .service 创建的符号链接WantedBy)并在他们重新编写它或从不运行时省略 [Install] 部分,无意中解决了他们的问题systemctl enable

TLDR;您不希望 .service 文件中的 [Install] 部分由 .timer 文件触发。


ter*_*don 0

我通过将“用户”计时器转换为根/系统计时器解决了这个问题。

  1. 我禁用了所有 .service 和 .timer 文件,并将它们从我的主目录移到 /etc/systemd/system 中。

  2. 我将“User=”部分添加到每个服务文件中,以便我的脚本由普通用户而不是 root 运行。

现在,我的计时器在系统启动时没有被触发,并且当我通过 ssh 登录时,我也遇到了偶尔触发的问题。现在这个问题也已经解决了,因为它们受到 root 帐户的控制,但运行我的脚本仍然以普通用户的 PID 运行,这保留了我的文件的所有权属性。问题解决了。


OP将此作为对问题的编辑发布,所以我在这里复制了它。