最近有人向我指出,存在 cron 的替代方案,即 systemd 计时器。
但是,我对 systemd 或 systemd 计时器一无所知。我只用过 cron。
Arch Wiki 中有一些讨论。但是,我正在寻找cron
systemd 计时器和 systemd 计时器之间的详细比较,重点是利弊。我使用 Debian,但我想对所有提供这两种替代方案的系统进行一般比较。该集合可能仅包括 Linux 发行版。
这是我所知道的。
Cron 非常古老,可以追溯到 1970 年代后期。cron 的原作者是 Unix 的创造者 Ken Thompson。Vixie cron 可追溯到 1987 年,现代 Linux 发行版中的 cron 是其中的直系后代。
Systemd 更新很多,也有些争议。维基百科告诉我它的初始版本是 2010 年 3 月 30 日。
因此,我目前的 cron 相对于 systemd 计时器的优势列表是:
Cron 保证可以在任何类 Unix 系统中使用,因为它是一个可安装的受支持软件。这不会改变。相比之下,systemd 将来可能会或可能不会保留在 Linux 发行版中。它主要是一个 init 系统,可能会被不同的 init 系统取代。
Cron 使用起来很简单。绝对比 systemd 计时器简单。
systemd 计时器相对于 cron 的相应优势列表是:
因此,总而言之,以下是一些最好在答案中看到的内容:
我正在尝试制作一个每 15 分钟运行一次的 systemd 计时器。现在我有:
timer-fifteen.timer
:
[Unit]
Description=15min timer
[Timer]
OnBootSec=0min
OnCalendar=*:*:0,15,30,45
Unit=timer-fifteen.target
[Install]
WantedBy=basic.target
Run Code Online (Sandbox Code Playgroud)timer-fifteen.target
:
[Unit]
Description=15min Timer Target
StopWhenUnneeded=yes
Run Code Online (Sandbox Code Playgroud)这一遍又一遍地运行,没有停止。有必要*:0,15,30,45:*
代替吗?我怎样才能使这项工作?
我已经成功地将我的一些 cron 作业迁移到了 systemd。我遵循了一些指南,并采用了创建 3 个文件的标准方法:
myjob.timer - systemd timer unit
myjob.service - systemd service unit
myjob.sh
Run Code Online (Sandbox Code Playgroud)
正如您可能猜到的那样,在某个时间触发 myjob.timer,它运行 myjob.service,然后执行 myjob.sh。
我的所有计时器都具有相同的设置,现在我看到一切正常,我想禁用 myjob.timer,它只是一个测试器。
我只是做:
systemctl --user disable myjob.timer
Run Code Online (Sandbox Code Playgroud)
还是我还必须做:
systemctl --user disable myjob.service
Run Code Online (Sandbox Code Playgroud)
正确的做法是什么?我对 systemd 很陌生,所以我想学习如何以正确的方式做事。我猜测禁用这两个单元是正确的,以保持系统没有超额行李运行。
我正在测试一个 systemd 计时器并尝试覆盖其默认超时,但没有成功。我想知道是否有办法让 systemd 告诉我们接下来要运行该服务的时间。
普通文件 ( /lib/systemd/system/snapbackend.timer
):
# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.timer.html
[Unit]
Description=Run the snapbackend service once every 5 minutes.
[Timer]
# You must have an OnBootSec (or OnStartupSec) otherwise it does not auto-start
OnBootSec=5min
OnUnitActiveSec=5min
# The default accuracy is 1 minute. I'm not too sure that either way
# will affect us. I am thinking that since our computers will be
# permanently running, it probably won't be that inaccurate anyway.
# See also: …
Run Code Online (Sandbox Code Playgroud) 我在 Arch Linux 上,我正在尝试创建一个 systemd 计时器作为 cron 替代方案,用于在电池电量不足的情况下休眠我的笔记本电脑。所以我写了这三个文件:
/etc/systemd/system/battery.service
[Unit]
Description=Preko skripte preveri stanje baterije in hibernira v kolikor je stanje prenizko
[Service]
Type=oneshot
ExecStart=/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
User=nobody
Group=systemd-journal
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/battery.timer
[Unit]
Description=Periodical checking of battery status every two minutes
[Timer]
OnUnitActiveSec=2min
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
#!/bin/sh
/usr/bin/acpi -b | /usr/bin/awk -F'[,:%]' '{print $2, $3}' | (
read -r status capacity
if [ "$status" = Discharging ] && [ "$capacity" -lt 50 ]; then
/usr/bin/systemctl hibernate
fi
)
Run Code Online (Sandbox Code Playgroud)
然后启用计时器我执行:
sudo systemctl enable battery.timer
sudo …
Run Code Online (Sandbox Code Playgroud) 我即将将该rsync --delete
目录 /mnt/foo 的服务写入远程服务器。但是,由于--delete
选项的原因,除非挂载 /mnt/foo,否则我不想运行它,因为这可能会导致删除远程上的所有文件。
用ConditionX
(例如ConditionPathIsDirectory
)和RequiresMountsFor=
指令实现什么,有什么区别(每个的优缺点)?
草稿:这是我目前的草图:
RequiresMountsFor=/mnt/foo
Run Code Online (Sandbox Code Playgroud)
对比
# assuming there is `bar_only_on_foo` subdirectory on monted directory, which does not exis on unmounted one.
ConditionPathIsDirectory=/mnt/foo/bar_only_on_foo
Run Code Online (Sandbox Code Playgroud)
添加到.service
文件:
# /etc/systemd/system/rsync_to_remotey.service
# or : /home/$USER/.config/systemd/user/rsync_to_remotey.service
[Unit]
Description=rsync USER X data to REMOTE Y
[Service]
Type=simple
ExecStart=/home/USERX/rsync_userx_to_remotey.sh
Run Code Online (Sandbox Code Playgroud)
为了正确起见,这里是.timer
文件:
# /etc/systemd/system/rsync_to_remotey.timer
# or : /home/$USER/.config/systemd/user/rsync_to_remotey.timer
[Unit]
Description=Runs every 30 minutes rsync USER X data to REMOTE Y
[Timer]
OnBootSec=30min
AccuracySec=1h …
Run Code Online (Sandbox Code Playgroud) systemctl status mytimer.timer
Run Code Online (Sandbox Code Playgroud)
告诉我它何时处于活动状态以及下一次触发何时到期。如何获取过去计时器触发时间的列表?
我使用systemd-cron
它在 /lib/systemd 下创建单元文件。单位文件cron-daily.timer
有
[Timer]
OnCalendar=daily
Run Code Online (Sandbox Code Playgroud)
这会在午夜触发脚本。我希望它们在凌晨 3 点触发。
如果我override.conf
在cron-daily.timer.d
目录下创建/etc/systemd/system
有
[Timer]
OnCalendar=*-*-* 03:00:00
Run Code Online (Sandbox Code Playgroud)
并运行daemon-reload,重新启动计时器并运行systemctl list-timers
它仍然想在00:00:00运行。但是,如果我改变我override.conf
的有
[Timer]
OnCalendar=hourly
Run Code Online (Sandbox Code Playgroud)
然后它想按预期每小时运行一次。为什么我不能覆盖服务以在特定时间运行?
所以我试图建立一个 systemd 服务,以便每天从基于日期的目录中启动一组文件(不同类型的期刊)。例如,今天的待办事项列表将位于:
~/Documents/Journals/2019/1/23/ToDo.md
Run Code Online (Sandbox Code Playgroud)
现在最简单的方法是把它放在一个单独的目录中,比如今天,然后让一个 bash 脚本将它移动到适当的位置,在上次修改时间不再是它被创建的时候,或者文件的大小比模板文件大。但是虽然这会更容易,但我想知道是否可以编写一个脚本来返回要通过服务中执行的命令通过管道传输的文件的目录。类似的东西:
ExecStart=/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md
Run Code Online (Sandbox Code Playgroud)
它将文件作为参数并根据日期返回目录/文件路径(与创建目录和文件的方式相同)。
这是可能的,还是我应该坚持已经提出的解决方案?
我用来systemd-timer
定期运行一个使用网络服务的脚本。
问题是,在系统恢复或唤醒时,互联网连接不会立即启动,但计时器会被触发,因此脚本返回错误(如果服务等待几秒钟,脚本将正确运行,并且会出现无需将任务推迟到下次运行。)
1-如何使计时器(或与其关联的服务)等待网络连接可用?
2-当系统尚未上线时,如何使计时器(或服务)不调用脚本?
systemd services network-interface systemd-timer connectivity
systemd-timer ×10
systemd ×9
services ×2
arch-linux ×1
bash ×1
connectivity ×1
cron ×1
linux ×1