cron 介绍
- cron是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使用计时器的功能。
- 配置文件格式:Minute Hour Day Month DayOFWeek Command
- 参数:
- -e 编辑该用户的计时器设置。
- -l 列出该用户的计时器设置。
- -r 删除该用户的计时器设置。
- -u<用户名称> 指定要设定计时器的用户名称。
运行规则
基本格式
1 | * * * * * command |
例子
1 | 30 19 * * * /usr/sbin/poweroff #每天晚上 7 点半关机 |
查看运行状态
如果你的定时任务没有执行,确认一下 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 -e1
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
6Jul 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>&11
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 | > 代表重定向到哪里,例如:echo "123" > /home/123.txt |
定时关机
如:上午 11 点过 8 分关机1
2
3crontab -e
# 输入以下内容
8 11 * * * /sbin/shutdown -h now
注意:/sbin/
是必须的,否则会提示 /bin/sh: shutdown: command not found
,该提示,从 /var/log/cron
可查到。
日志问题
每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件