如题

cron 介绍

  1. cron是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使用计时器的功能。
  2. 配置文件格式:Minute Hour Day Month DayOFWeek Command
  3. 参数:
    • -e 编辑该用户的计时器设置。
    • -l 列出该用户的计时器设置。
    • -r 删除该用户的计时器设置。
    • -u<用户名称> 指定要设定计时器的用户名称。

运行规则

基本格式

1
2
3
4
5
6
7
8
*    *    *   *   *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

例子

1
2
3
4
5
6
7
8
9
10
11
12
30 19 * * * /usr/sbin/poweroff #每天晚上 7 点半关机
30 21 * * * /usr/local/etc/rc.d/apache restart #每晚的21:30 重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/apache restart #每月1、10、22日的4 : 45重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/apache restart #每周六、周日的1 : 10重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/apache restart #每天18 : 00至23 : 00之间每隔30分钟重启apache
0 23 * * 6 /usr/local/etc/rc.d/apache restart #每星期六的11 : 00 pm重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/apache restart #晚上11点到早上7点之间,每隔一小时重启 apache
* */1 * * * /usr/local/etc/rc.d/apache restart #每一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/apache restart #每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/apache restart #一月一号的4点重启apache
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 #每半小时同步一下时间
0 */2 * * * www /usr/bin/somecommand >> /dev/null 2>&1 #以用户www的身份每两小时就运行某个程序

查看运行状态

如果你的定时任务没有执行,确认一下 crond 服务是否运行

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@centOS7BasicForTest shell.script]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-06-21 07:51:56 HKT; 10h ago
Main PID: 601 (crond)
CGroup: /system.slice/crond.service
└─601 /usr/sbin/crond -n

Jun 21 07:51:56 centOS7BasicForTest systemd[1]: Started Command Scheduler.
Jun 21 07:51:56 centOS7BasicForTest systemd[1]: Starting Command Scheduler...
Jun 21 07:51:56 centOS7BasicForTest crond[601]: (CRON) INFO (Syslog will be used instead of sendmail.)
Jun 21 07:51:56 centOS7BasicForTest crond[601]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 26% if used.)
Jun 21 07:51:56 centOS7BasicForTest crond[601]: (CRON) INFO (running with inotify support)

配置定时任务执行脚本

crontab -e

1
5 11 * * * /root/shell.script/elsafly.sh

并未正确执行

定时任务在日志里有执行,但是实际上,脚本命令执行后,没有生效。

解决:
在要执行的脚本(elsafly.sh)中,加载系统环境变量

1
2
#!/bin/sh
source /etc/profile

定时任务有错

tail -f /var/log/cron 查日志,提示:

1
2
3
4
5
6
Jul 10 11:05:01 izwz97mqm1h3u2vxe4kesjz crond[467]: (root) RELOAD (/var/spool/cron/root)
Jul 10 11:05:01 izwz97mqm1h3u2vxe4kesjz CROND[25785]: (root) CMD (/root/shell.script/elsafly.sh)
Jul 10 11:05:02 izwz97mqm1h3u2vxe4kesjz CROND[25793]: (CRON) EXEC FAILED (/usr/sbin/sendmail): No such file or directory
Jul 10 11:05:02 izwz97mqm1h3u2vxe4kesjz CROND[25784]: (root) MAIL (mailed 146 bytes of output but got status 0x0001#012)
Jul 10 11:10:01 izwz97mqm1h3u2vxe4kesjz CROND[25801]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jul 10 11:14:16 izwz97mqm1h3u2vxe4kesjz crontab[25806]: (root) BEGIN EDIT (root)

解决,在脚本后面添加 > /dev/null 2>&1

1
18 11 * * * sh /root/shell.script/elsafly.sh > /dev/null 2>&1

【> /dev/null 2>&1】解释

可以将/dev/null看作”黑洞”. 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.
用处:
禁止标准输出. 1 cat $filename >/dev/null # 文件内容丢失,而不会输出到标准输出.
禁止标准错误. 2>/dev/null 这样错误信息[标准错误]就被丢到太平洋去了.

1
2
3
4
> 代表重定向到哪里,例如:echo "123" > /home/123.txt 
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

定时关机

如:上午 11 点过 8 分关机

1
2
3
crontab -e
# 输入以下内容
8 11 * * * /sbin/shutdown -h now

注意:/sbin/ 是必须的,否则会提示 /bin/sh: shutdown: command not found,该提示,从 /var/log/cron 可查到。

日志问题

每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件