cron用法整理

看了很多资料把cron和crontab混为一谈,这里从澄清概念开始。

0、什么是cron。
在Linux环境下,周期性执行一些任务,用cron。cron由crond守护进程和一组crontab文件(配置文件)组成。

crond守护进程随系统启动,每分钟读取检查一次crontab文件,并通过fock子进程执行满足条件的指令。

# 查看cron手册
man cron
# 查看crond进程
ps -ef | grep 'crond' | grep -v 'grep'

1、crontab命令。
我们通常说crontab指的是crontab命令,通过该命令设置周期性执行的指令。最常使用的是查看和编辑指令, 如下:

# 查看指令
crontab -l
# 编辑指令
crontab -e

2、crontab文件。
2.1、crontab文件说明和路径。
周期性执行的任务,这些任务通过编写周期性执行的指令来执行,指令存放的文件称为”crontab”文件。
整个系统的crontab文件路径:/etc/crontab。
每个用户的crontab文件路径:/var/spool/cron/uname。例如root: /var/spoll/cron/root。
直接通过vim编辑该文件,跟crontab -e编辑指令效果完全一样。

2.2、crontab文件编写格式。
文件格式可以通过一下命令查看

cat /etc/crontab

# 文件格式说明
# ——分钟(0 – 59)
# | ——小时(0 – 23)
# | | ——日(1 – 31)
# | | | ——月(1 – 12)
# | | | | ——星期(0 – 7,星期日=0或7)
# | | | | |
# * * * * * 被执行的命令
每一行由空格或tab分隔成多个领域,前5个域分别是”分时日月周”,为数字或*,数字表示具体的时间,*表示任何时刻,第6个起为要执行的命令
例如:

# 每月1号00:05:00重启一次nginx
5 0 1 * * /usr/bin/systemctl reload nginx

3、常用任务写法。
3.1、每隔一分钟执行一次任务。

* * * * * /usr/bin/systemctl reload nginx
# 没必要写成*/1
*/1 * * * * /usr/bin/systemctl reload nginx

3.2、每隔N个小时执行一次任务。

# 每隔4个小时执行一次。准确说法是每4个小时的0分执行一次。
# 正确写法【执行时间分别是4的倍数: 04:00 08:00 12:00 16:00 20:00】
00 */4 * * * /usr/bin/systemctl reload nginx
# 错误写法
* */4 * * * /usr/bin/systemctl reload nginx

3.2、每隔2分钟执行一次任务。

*/2 * * * * /usr/bin/systemctl reload nginx

实际执行时间是每小时的00分,02分,04分…(被2整除的数),有一个在线的工具可以显示接下来执行的时间,好用!

例,当前时间是2019-03-10 18:51:00 执行时间如下图:

4、不发送email
默认情况crond守护进程会把命令返回结果通过电子邮件发给用户。
4.1、关闭某个命令的输出结果,命令没有输出结果就不会发邮件。

# 每天02:05分执行一次, 把脚本test.php所有的输出都重定向到/dev/null
05 02 * * * /usr/local/php/bin/php /home/test.php >/dev/null 2>&1

4.2、关闭全部命令的邮件输出。
在crontab文件第一行加入

MAILTO=""

记得有一次一台测试服务器磁盘一直报警,发现/var/spool/mail/下的文件一直增加导致的,根本原因是crond发邮件失败产生的大量错误日志。后来关闭发送邮件就正常了。

5、crontab编辑报错

[root@freya50 rprank.tv.weibo.cn]# crontab -e
crontab: installing new crontab
crontab: error while writing new crontab to /var/spool/cron/tmp.XXXXcl0i2r
crontab: edits left in /tmp/crontab.hK3xSD

大概率是磁盘满了df -h查看

参考:
维基百科:Cron

发表评论

电子邮件地址不会被公开。 必填项已用*标注