Cron是类Unix系统里最多见的任务计划程序,而Systemd也开始提供定时器做为Cron的替代品。尽管争议不断,Systemd仍是被愈来愈多的Linux发行版使用,Ubuntu也是如此。所以在须要建立定时任务时我决定向"邪恶势力"低头,基于Systemd来实现。命令行
Systemd配置根据功能划分到不一样的单元,如系统服务(.service)属于服务单元,定时器(.timer)则属于定时器单元。每种单元有本身的配置文件格式。日志
不一样于Cron经过crontab一行添加一个定时任务,Systemd要建立定时任务须要建立两个文件,一个定时器单元文件定义定时任务的激活时间,一个服务单元文件定义定时器激活时执行的具体任务。从这个角度想,至关于定时任务激活时经过systemctl start XXX.service
启动了一个系统服务。不过一个定时任务须要两个文件这种方式仍是很麻烦了。code
systemd建立定时任务的主要步骤事件
定时器单元文件是以timer为后缀的systemd单元文件,定时器单元文件包括三个部分crontab
[Unit]部分定义了systemd单元文件通用的一些配置,[Install]部分定义安装systemd单元须要的配置,在systemd执行过程当中不会用到,仅在调用systemctl enable
或者systemctl disable
设置开机启动时须要。ip
[Timer]部分定义了什么时候以及如何激活定时事件。Timers 能够被定义成如下两种类型:get
单调定时器 即从一个时间点过一段时间后激活定时任务。全部的单调计时器都遵循以下形式: OnTypeSec=。有如下几种类型it
* OnActiveSec 时间点为定时器启动 * OnBootSec 时间点为系统启动 * OnStartupSec 时间点为systemd启动时间 * OnUnitActiveSec 时间点为上次定时器任务激活时间 * OnUnitInactiveSec 时间点为上次定时器任务执行完毕的时间
不一样的类型能够组合,以下面的配置,在系统启动15分钟后第一次执行,以后每隔1周执行一次。io
[Timer] OnBootSec=15min OnUnitActiveSec=1w
时间间隔的全部定义格式能够经过man systemd.time
查看。登录
实时定时器 (亦称"挂钟定时器") 经过日历事件激活(相似于 cronjobs )定时任务。 使用 OnCalender= 来定义实时定时器。
以下面的配置OnCalendar=Wed, 23:15
表示每周三的23点15分执行。日历事件的详细定义格式能够经过man systemd.time
查看。
下面是一个定时器单元文件。
[Unit] Description=Run foo weekly and on boot [Timer] OnCalendar=Wed, 23:15 [Install] WantedBy=timers.target
服务单元文件也包括三部分,只是没有[Timer]部分,增长了[Service]部分,这部分定于服务执行相关的配置,最经常使用的是ExecStart,设置服务启动时须要执行的操做。
以下面的服务单元文件,ExecStart=/usr/local/bin/foo
表示启动时执行foo程序。
[Unit] Description=MyScript [Service] ExecStart=/usr/local/bin/foo
这里的服务单元只由定时器单元调用,因此不须要[Install]部分。
单元文件要放在Systemd指定的路径才能生效。Systemd单元按照运行模式分两种,system模式和user模式。 system模式只要系统在运行就会生效,而user模式在用户登陆状态才会生效。两种模式下单元文件的路径也不一样。
Systemd在system模式下加载单元文件的路径,优先级从高到低有
Systemd在user模式下加载单元文件的路径,优先级从高到低有
建立定时器时,定时器单元文件和服务单元文件必须在同一个目录下,且文件名相同,只是后缀不一样(一个为.timer,一个为.service)。如建立名为foo的定时器任务,运行在system模式,能够在/etc/systemd/system/下创建一个foo.timer文件和一个foo.service文件。
Systemd的命令行操做是用过systemctl命令实现的。
启动定时器
$ systemctl start XXX.timer
中止定时器
$ systemctl stop XXX.timer
设置开机自动启动
$ systemctl enable XXX.timer
取消开机启动
$ systemctl disable XXX.timer
查看已启动的全部定时器
$ systemctl list-timers
查看定时器的运行状态
systemctl status XXX.timer
定时器运行出错时须要查看日志进行分析,systemd日志为二进制格式,能够经过journal命令查看
$ journal -xe