使用 systemd-timer 代替 crontab 执行定时任务

Arch 上已经不预装 crontab 了,但是有全套(?)的 systemd 套件,所以可以用 systemd-timer 来代替定时任务的执行。

这里就讲一下定时(固定时间执行)任务好了,我觉得它的缺点(?)是需要一个 .service 和它相匹配,所以就是有一个 timer 跟着一个 service ,才能把定时任务组合起来。

Service 配置

这里假设我需要执行一个 Python 所写的程序,并且将这个服务命名为 python-timer.service

之后把下列的文件添加进 /etc/systemd/system/

[Unit]
Description=Python timer test
Wants=python-timer.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/python -c "import time; print(time.time())"

[Install]
WantedBy=multi-user.target

这个服务会在指定的时候输出当前时间

Timer 配置

那我们也同时需要一个 timer 文件,放在 /etc/systemd/system/ 中。这个 timer 文件命名为 python-timer.timer 好了

这里的例子是让其每天的三点钟运行

[Unit]
Description=Python timer test timer
Wants=python-timer.service

[Timer]
Unit=python-timer.service
OnCalendar=*-*-* 4:30:00

[Install]
WantedBy=timers.target

把这两个配置文件写好以后,就执行重载指令

$ sudo systemctl daemon-reload

然后把 timer 启用

$ sudo systemctl enable python-timer.timer

之后我们使用下列指令就能看到 timer 情况了

$ sudo systemctl status python-timer.timer
● python-timer.timer - Python timer test timer
     Loaded: loaded (/etc/systemd/system/python-timer.timer; enabled; vendor preset: disabled)
     Active: active (waiting) since Thu 2021-04-22 01:12:58 CST; 7s ago
    Trigger: Thu 2021-04-22 04:30:00 CST; 3h 16min left
   Triggers: ● python-timer.service

Apr 22 01:12:58 systemd[1]: Started Python timer test timer.