文章目录
抛弃 cron 拥抱 systemd timer
坑:记得所有的路径都要用绝对路径
Timers 是以 .timer
为后缀名的 systemd 单元文件,用于控制 .service
文件或事件。Timers 可用来替换 cron(阅读 #替代 cron)。Timers 内置了日历定时事件和单调定时事件的支持,并可以异步执行这些事件
定时器单元
Timers 是以 .timer 为后缀的 systemd 单元文件。Timers 和其他单元配置文件是类似的,它通过相同的路径加载,不同的是包含了 [Timer] 部分。 [Timer] 部分定义了何时以及如何激活定时事件。Timers 可以被定义成以下两种类型:
单调定时器 即从一个时间点过一段时间后激活定时任务。所有的单调计时器都遵循如下形式: OnTypeSec=。 OnBootSec 和 OnActiveSec 是常用的单调定时器。
实时定时器 (亦称"挂钟定时器") 通过日历事件激活(类似于 cronjobs )定时任务。 使用 OnCalender= 来定义实时定时器。
服务单元
每个 .timer 文件所在目录都得有一个对应的 .service 文件(如 foo.timer 和 foo.service)。.timer 用于激活并控制 .service 文件。 .service 文件中不需要包含 [Install] 部分,因为这由 timer 单元接管。必要时通过在定时器的 [Timer] 部分指定 Unit= 选项来控制一个与定时器不同名的服务单元。
示例
Service 单元只是定义了如何执行任务
首先创建个 app_spider_article.service
Service 单元就是所要执行的任务,比如发送邮件就是一种 Service。
新建 Service 非常简单,就是在/usr/lib/systemd/system
目录里面新建一个文件,比如mytimer.service
文件,你可以写入下面的内容。
1234567 [Unit]Description=app spider article service[Service]ExecStart=/tmp/app_spider/article/article_env/bin/python /tmp/app_spider/article/app_spider_article/main.py[Install]WantedBy=multi-user.target
可以看到,这个 Service 单元文件分成两个部分。
[Unit]
部分介绍本单元的基本信息(即元数据),Description
字段给出这个单元的简单介绍(名字叫做MyTimer
)。
[Service]
部分用来定制行为,Systemd 提供许多字段。
ExecStart
:systemctl start
所要执行的命令ExecStop
:systemctl stop
所要执行的命令ExecReload
:systemctl reload
所要执行的命令ExecStartPre
:ExecStart
之前自动执行的命令ExecStartPost
:ExecStart
之后自动执行的命令ExecStopPost
:ExecStop
之后自动执行的命令
注意,定义的时候,所有路径都要写成绝对路径,比如bash
要写成/bin/bash
,否则 Systemd 会找不到。
现在,启动这个 Service。
12 $ sudo systemctl start mytimer.service
如果一切正常,你应该就会收到一封邮件。
要定时执行这个 Service,还必须定义 Timer 单元。
app_spider_article.timer
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description=app spider article timer [Timer] OnCalendar=*-*-* 13:38:00 Unit=app_spider_article.service [Install] WantedBy=multi-user.target |
[Unit]
部分定义元数据。
[Timer]
部分定制定时器。Systemd 提供以下一些字段。
OnActiveSec
:定时器生效后,多少时间开始执行任务OnBootSec
:系统启动后,多少时间开始执行任务OnStartupSec
:Systemd 进程启动后,多少时间开始执行任务OnUnitActiveSec
:该单元上次执行后,等多少时间再次执行OnUnitInactiveSec
: 定时器上次关闭后多少时间,再次执行OnCalendar
:基于绝对时间,而不是相对时间执行AccuracySec
:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒Unit
:真正要执行的任务,默认是同名的带有.service
后缀的单元Persistent
:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元WakeSystem
:如果系统休眠,是否自动唤醒系统
上面的脚本里面,OnCalendar=*-*-* 13:38:00
表示 每天凌晨 13点38分执行任务 ,OnUnitActiveSec=1h
表示一小时执行一次任务。其他的写法还有OnUnitActiveSec=*-*-* 02:00:00
表示每天凌晨两点执行,OnUnitActiveSec=Mon *-*-* 02:00:00
表示每周一凌晨两点执行,具体请参考官方文档
[Install]
部分,定义开机自启动(systemctl enable
)和关闭开机自启动(systemctl disable
)这个单元时,所要执行的命令。
定时器的相关命令
下面,启动刚刚新建的这个定时器。
12 $ sudo systemctl start app_spider_article.timer
你应该立刻就会收到邮件,然后每个小时都会收到同样邮件。
查看这个定时器的状态。
12 $ systemctl status app_spider_article.timer
查看所有正在运行的定时器。
123456 [root@VM_105_11_centos system]# systemctl list-timersNEXT LEFT LAST PASSED UNIT ACTIVATESThu 2020-01-09 18:01:39 CST 2h 29min left Wed 2020-01-08 18:01:39 CST 21h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.serviceFri 2020-01-10 01:00:00 CST 9h left n/a n/a app_spider_article.timer app_spider_article.serviceFri 2020-01-10 12:15:00 CST 20h left Thu 2020-01-09 12:15:01 CST 3h 17min ago test.timer test.service
关闭这个定时器。
12 $ sudo systemctl stop app_spider_article.timer
下次开机,自动运行这个定时器。
12 $ sudo systemctl enable app_spider_article.timer
关闭定时器的开机自启动。
12 $ sudo systemctl disable app_spider_article.timer
修改timer 后
1 2 3 |
# 一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效 systemctl daemon-reload |
日志相关命令
如果发生问题,就需要查看日志。Systemd 的日志功能很强,提供统一的命令。
123456789101112131415 # 查看整个日志$ sudo journalctl# 查看 mytimer.timer 的日志$ sudo journalctl -u app_spider_article.timer# 查看 app_spider_article.timer 和 app_spider_article.service 的日志$ sudo journalctl -u app_spider_article.timer# 从结尾开始查看最新日志$ sudo journalctl -f# 从结尾开始查看 app_spider_article.timer的日志$ journalctl -f -u app_spider_article.timer
启动定时任务
1 2 3 4 5 |
systemctl daemon-reload # 重新加载服务 systemctl enable app_spider_article.service systemctl enable app_spider_article.timer systemctl start app_spider_article.timer |
参考:
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.imooc.com/article/28208
https://wiki.archlinux.org/index.php/Systemd/Timers_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#%E5%AE%9A%E6%97%B6%E5%99%A8%E5%8D%95%E5%85%83

全部评论:1条