Linux定时任务--Crond使用教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux定时任务--Crond使⽤教程
Linux定时任务--Crond使⽤教程
1. 介绍Crond
crond是linux下⽤来周期性的执⾏某种任务或等待处理某些事件的⼀个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务⼯具,并且会⾃动启动crond进程,crond进程每分钟会定期检查是否有要执⾏的任务,如果有要执⾏的任务,则⾃动执⾏该任务。
Cron 是UNIX, SOLARIS,LINUX下的⼀个⼗分有⽤的⼯具。
通过Cron脚本能使计划任务定期地在系统后台⾃动运⾏。
这种计划任务在UNIX, SOLARIS, LINUX下术语为cron jobs。
Crontab (CRON 表)则是⽤来记录在特定时间运⾏的CRON的⼀个脚本⽂件。
2. 控制Crond状态的命令
crontab -l #查看任务
crontab -e #便捷定时编辑任务
systemctl reload crond.service #重启crontab
systemctl start crond.service
systemctl stop crond.service
systemctl restart crond.service
# 如果不⽀持systemctl命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载⼊配置
service crond status //查看服务状态
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载⼊配置
# 设置Crond开机是否⾃启
# 1. 查看crond.serivce服务的⾃启动状态
systemctl is-enabled crond/crond.service
> disabled
# 1.1 此时crond.serivce的⾃启动状态为disabled [开机不会⾃启动]
# 1.2 如果时enabled,表⽰⾃启动状态为enabled [开机会⾃启动]
# 开启crond.serivce服务⾃启动
systemctl enable crond/crond.service
systemctl is-enabled crond/crond.service
> enabled
# 列出所有的启动⽂件:
systemctl list-unit-files
# 列出所有状态为enable的启动⽂件
systemctl list-unit-files | grep enable
# 关闭crond.serivce的⾃启动状态
systemctl disable crond/crond.service
3. 权限控制
为了安全性,可以限制使⽤crontab的⽤户账号,使⽤的限制数据:
/etc/cron.allow
将可以使⽤的crontab的账号写⼊其中,若不在这个⽂件内的⽤户则不可使⽤crontab
/etc/cron.deny
将不可使⽤crontab的账号写⼊其中,若未记录到这个⽂件当中的⽤户,就可以使⽤crontab。
以优先级来说,/etc/cron.allow⽐/etc/cron.deny要优先,⼀般来说,建议只保留⼀个即可,系统默认是保留/etc/cron.deny。
当⽤户使⽤crontab这个命令新建⼯作调度之后,这项⼯作就会被记录到/var/spool/cron/⾥⾯,⽽且以该账号来判别的。
举例:tom 使⽤crontab后,他的⼯作会被记录到/var/spool/cron/tom⾥⾯去。
也就是说/var/spool/cron/tom 记录了,tom⽤户编辑的定时任务。
cron执⾏的每⼀项⼯作都会被记录到/var/log/cron这个⽇志⽂档中;
Java程序输出在Console中的⽇志也会打印到/var/log⽬录中的message⽂件中
4. Crontab命令
时间段分别代表的含义
0 12 * * *
分时⽇⽉周
不能使⽤vi直接编辑该⽂件,因为可能由于输⼊语法错误,会导致⽆法执⾏cron。
使⽤crontab -e 命令来编辑
每项⼯作(每⾏)的格式都是具有六个字段,这六个字段的意义如下表:
command ⼀般我们⽤的是可执⾏的shell⽂件
⽐较有趣的是那个”周”,周的数字为0或7时,代表的是星期天的意思。
下图介绍⼀下辅助的字符
例⼦
5. 系统的配置⽂件:/etc/crontab
crontab -e 命令是针对⽤户的cron设计的,如果是系统的例⾏性任务时,就需要系统的配置⽂件/etc/crontab
其实 crontab -e 其实是/usr/bin/crontab这个⽂件,⽽etc/crontab 是系统的配置⽂件
看这个⽂件内容其实与刚才的crontab -e 的内容⼏乎⼀样,但是还有⼏个地⽅不⼀样
1、MAILTO=root
这个选项的意思是说,当 /etc/crontab 这个档案中的例⾏性命令发⽣错误时,会将错误讯息或者是屏幕显⽰的讯息传给谁?由于 root 并⽆法再⽤户端收信,因此,我通常都将这个 e-mail 改成⾃⼰的账号,好让我随时了解系统的状态!
2、PATH=….
这⾥就是输⼊执⾏⽂件的查找路径,使⽤默认的路径设置就已经很⾜够了。
3、01 * * * * root run-parts /etc/cron.hourly:
在 #run-parts 这⼀⾏以后的命令,我们可以发现,五个数字后⾯接的是 root ,这⼀⾏代表的是『执⾏的级别为root⾝份』当然,你也可以将这⼀⾏改为成其他的⾝份!⽽ run-parts代表后⾯接的 /etc/cron.hourly 是『⼀个⽬录内(/etc/cron.hourly)的所有可执⾏⽂件』,也就是说,每个⼩时的01分,系统会以root⾝份去/etc/cron.hourly这个⽬录下执⾏所有可执⾏的⽂件!后⾯三⾏也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个⽬录!你可以将每天需要执⾏的命令直接写到/etc/cron.daily即可,还不需要使⽤到crontab -e的程式!
举例:
注意:周与⽇、⽉不可同时并存
6. 定时任务脚本输出内容重定向
如果crontab不重定向输出,并且crontab所执⾏的命令有输出内容的话,是⼀件⾮常危险的事情。
因为该输出内容会以邮件的形式发送给⽤户,内容存储在邮件⽂件
/var/spool/mail/$user
如果命令执⾏⽐较频繁(如每分钟⼀次),或者命令输出内容较多,会使这个邮件⽂件不断追加内容,⽂件越来越⼤。
⽽邮件⽂件⼀般存放在根分区,根分区⼀般相对较⼩,所以会造成根分区写满⽽⽆法登录服务器。
所以在添加crontab命令时,⽆论命令是否有输出,最好都加上输出重定向到⽂件或者/dev/null中。
如下
*/5 * * * * /root/XXXX.sh &>/dev/null 2>&1
`感觉上⾯的语句应该改有问题,应该使⽤下⾯的语句`
*/5 * * * * /root/XXXX.sh 1>/dev/null 2>&1
输出内容写⼊⽂件的两种⽅式:
追加: echo " " >> ⽂件名
覆盖: echo " " > ⽂件名
/dev/null 代表空设备⽂件
> 代表重定向到哪⾥,例如:echo "123" > /home/123.txt
1 表⽰stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表⽰stderr标准错误
& 表⽰等同于的意思,2>&1,表⽰2的输出重定向等同于1
那么>/dev/null 2>&1的意思就是:
标准输出重定向到空设备⽂件,也就是不输出任何信息到终端,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备⽂件,所以标准错误输出也重定向到空设备⽂件。
我们也可以将我们通过定时任务执⾏的脚本的输出内容,输出到⽂件
# 定时任务配置
*/1 * * * * /var/spool/cron/bash/test.sh >> /var/spool/cron/bash/test.log
# test.sh ⽂件内容
#!/bin/bash
echo "hello crond"
# test.log
hello crond
hello crond
hello crond
hello crond
hello crond
hello crond
......
7. 常⽤列⼦
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上⾯的例⼦表⽰每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上⾯的例⼦表⽰每⽉1、10、22⽇的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上⾯的例⼦表⽰每周六、周⽇的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上⾯的例⼦表⽰在每天18 : 00⾄23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上⾯的例⼦表⽰每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每⼀⼩时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔⼀⼩时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每⽉的4号与每周⼀到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
⼀⽉⼀号的4点重启apache
参考链接。