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
echo
‘hello word!‘ >>
/tmp/a
.log
sleep
1
#间隔执行时间为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 声明。