码迷,mamicode.com
首页 > 系统相关 > 详细

linux基础服务,定时任务之crond

时间:2018-01-09 16:54:00      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:text   linux基础   pts   电子邮件   命令   事件   账户   color   启动   

linux下有两个定时执行服务,crond和atd。at针对仅运行一次的任务,或者开机后多少时间执行的任务。
 
一、crond简介(centos6.5)
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
 
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
 
技术分享图片
 
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。重启命令只能写在系统/etc/crontab中才能生效,个人crontab是不生效的。
 
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
crontab -e 默认创建root用户的crontab文件,所以是相当于编辑 /var/spool/cron/root 
 
指定用户创建定时任务,创建普通用户的定时任务,基于权限考虑,一些不需要root就可以执行的任务可以用普通用户创建。
crontab -u 用户名 -e      #编辑指定用户的crontab任务
crontab -u 用户名 -l      #查看指定用户的crontab任务

 

二、crond服务

/sbin/service crond start    //启动服务
/sbin/service crond stop    //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload  //重新载入配置

 

技术分享图片

 

特殊符号含义
* 代表每的意思,比如第一个*代表每分钟,第二个*代表每小时。
, 代表不连续的时间,比如00  9,21  *  *  * 代表每天的9点和21点00分各执行一次。
- 连续的时间范围, 比如 00,30  9-15  *  *  1-5  代表周一到周五的每天9点到15点之间,分别在00分和30分执行。
*/n 每隔多久执行一次,*/5   *  *  *  * ,每5分钟执行一次任务。

 

定时任务脚本基本语法

#print the hello
* * * * * /bin/sh  /script/my.sh >/dev/null 2>&1
最好写上/bin/sh,这样即使脚本忘记加X权限,也可以顺利执行。
bash脚本要写全路径,不然crontab会搜索用户home目录下的同名文件。
每个任务都应该添加注释,以方便自己或者别人查阅维护。
 
 
三,实例
 
*    *    *    *    *  command        
每一分钟执行一次command(因cron默认每1分钟扫描一次,因此全为*即可)
 
00,30  *    *    *    *  command
每小时的第00和第30分钟执行command,也可以写成*/30 *    *    *   *
 
3,15  8-11  */2  *   *  command
每隔2天的上午8-11点的第3和15分钟执行command
 
15,45  8-11   *   *  1 command
每个星期一的上午8点到11点的第15和第45分钟执行command
 
30  21   *   *  *   /etc/init.d/smb restart
每晚的21:30重启smb
 
45  4  1,10,22  *  *  /etc/init.d/smb restart
每月1、10、22日的4 : 45重启smb
 
10  1  *  *  6,0  /etc/init.d/smb restart
每周六、周日的1 : 10重启smb
 
 
0,30  18-23  *  *  *  /etc/init.d/network   restart
每天18至23之间的00分和30分重启 network 
 
0  1   *   *   *     /bin/sh  /script/aaa.sh
每天1点整执行 aaa.sh
 
0 11 4 * 1-5 /etc/init.d/smb restart
这样写不规范,一般日和周不要同时使用,时间上会有不确定性。
 
*  */1  *  *  *  /etc/init.d/smb restart
每一小时重启smb?
这样写是不对的,因为第一位分钟是*,所以此任务会每分钟执行一次,而不是每小时执行。
 
 
四,备份和恢复
 
crontab -l > $HOME/mycron  #备份crontab内容到home下的mycron
crontab mycron                 #导入备份文件
[root@centos68 ~]# crontab mycron
[root@centos68 ~]#
[root@centos68 ~]# crontab -l
....
#start nginx after boot
05 11 * * * /bin/sh /script/start_nginx.sh >/dev/null 2>&1
 
#* */1 * * * echo $(date)‘123‘ >/dev/pts/0
 
*/10 * * * * echo $(date +\%F-\%H-\%M) >/data/log
 
 
注意事项:
1:crond 服务默认每分钟检测是否有需要执行的任务,有的话就执行。
 
2:对于秒级的任务crond无法实现。
秒级任务可以通过shell脚本,然后加入sleep实现。
 
#!/bin/bash
while true
echohello word!‘ >>/tmp/a.log
sleep #间隔执行时间为1秒
do
done
 
 
3:定时任务写在bash脚本里执行,不要直接在crontab里写命令。
crontab 里%会有问题,所以date +%F带%号会有错误,写在bash里就没问题。
可以在%号前加\%让系统识别。
 
4:定时任务后加 >/dev/null 2>&1,取消结果输出到屏幕。
如果确实需要保存日志,可以后面加 >/a.log 2>&1 将输出追加到指定文件。
 
5:最好写上/bin/bash,这样即使脚本忘记加X权限,也可以顺利执行。
sh脚本要写全路径,不然crontab会搜索用户home目录下的同名文件。
每个任务都应该添加注释,以方便自己或者别人查阅维护等。
 
6:crontab -e 默认是root用户的定时任务 /var/spool/cron/root
 
有些定时任务不需要root那么高的权限的话,可以指定相关账户执行。
crontab -u hsm -e
编辑hsm用户的crontab定时任务。
crontab -u hsm -l
查看hsm用户的crontab定时任务。
 
7:定时任务也可以写在/etc/crontab  里,不过这是系统的定时任务文件,一般不要写在这里面。
 
8:环境变量不能直接在crontab里调用,一定要写在脚本里,使用前最好提前声明。在脚本里export 声明。
 
 

linux基础服务,定时任务之crond

标签:text   linux基础   pts   电子邮件   命令   事件   账户   color   启动   

原文地址:https://www.cnblogs.com/sunny18/p/8251663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!