linux有两种计划执行方式:
一种是计划某一时刻执行一次
一种是定时周期执行
执行计划at:
就是计划在某一个时刻执行一次命令
demo:
[root@localhost tmp]# at 09:35 #指定执行时间点 系统时间录入date查看
at> cp /etc/passwd ./ #执行任务,把/etc/passwd 拷贝当前目录
at> <EOT> #按ctrl+d结束录入
job 3 at 2017-09-10 09:35
执行结果 ,看到了passwd文件
[root@localhost tmp]# ll
total 48
drwx------. 2 root root 4096 Sep 10 09:23 keyring-enJgj6
drwx------. 2 root root 4096 Sep 10 08:33 keyring-tS6oXp
drwx------. 2 gdm gdm 4096 Sep 10 09:23 orbit-gdm
drwx------. 2 root root 4096 Sep 10 09:23 orbit-root
-rw-r--r--. 1 root root 1576 Sep 10 09:35 passwd
这种方式只能执行一次,基本不会使用,没什么业务场景
执行计划crontab:
生产中的任务,一般是定时调度的,比如T+1的等,而且crontab也是最开始的企业中用的最多的定时调度方式,现在的企业中调度一般用HUE写coordinator,nifi或者superset等数据对接软件,也有这种定时执行机制。
要是用crontab我们首先要开启crond服务。
临时开启:
service crond status
service crond start
service crond stop
查看下我们系统各crond服务状态,我们的crond是开启的。
[root@localhost tmp]# service crond status
crond (pid 1814) is running...
永久开启crond服务,使用chkconfig 和永久开启防火墙类似
chkconfig crond start
chkconfig crond stop
我们可以先看看crontab的使用说明crontab –help
[root@localhost tmp]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab) #编辑计划任务
-l (list user's crontab) #列出计划任务
-r (delete user's crontab) #删除计划任务
-i (prompt before deleting user's crontab)
-s (selinux context)
我们输入crontab -e 会需要我们编辑计划内容
那么内容怎么填呢????
其实内容就是一行,但是有一个语法,下面是6列,前面5列用来表示计划执行的时间,第6列是执行的任务。
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
如果时间是一段时间,用(-)表示一段时间,
如果时间是多干个不相关的时间点,用(,)隔开,
如果时间为任意时间,则用(*)表示
用(/)表示间隔时间
demo:
每周五凌晨两点整
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
0 | 2 | * | * | 5 | execute command |
每月10号15号的凌晨两点整
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
0 | 2 | 10,15 | * | * | execute command |
每5分钟执行一次
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
*/5 | * | * | * | * | execute command |
每天凌晨一点到三点
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
* | 1-3 | * | * | * | execute command |
每小时的10分的时候执行一次
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
10 | * | * | * | * | execute command |
每月1号执行一次
* | * | * | * | * | execute command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | execute command |
* | * | 1 | * | * | execute command |
[root@localhost ~]# crontab -e
*/1 * * * * date >> /root/data.txt
查看结果:
[root@localhost ~]# crontab -l
*/1 * * * * date >> /root/data.txt
重启crond服务:
[root@localhost tmp]# service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
到/root目录下查看执行结果:
[root@localhost ~]# cat data.txt
Sun Sep 10 10:06:01 CST 2017
Sun Sep 10 10:07:01 CST 2017
Sun Sep 10 10:09:01 CST 2017
Sun Sep 10 10:10:01 CST 2017
注意: executecommand 的输出结果路径必须为绝对路径,否则不生效!!!