cron 是 UNIX, SOLARIS,LINUX 下的一个十分有用的工具。通过 cron 脚本能使计划任务定期地在系统后台自动运行。
crontab -e – 编辑该用户的 crontab,当指定 crontab 不存在时新建。
crontab -l – 列出该用户的 crontab。
crontab -r – 删除该用户的 crontab。
crontab -u<用户名称> – 指定要设定 crontab 的用户名称。
重启命令:
/etc/init.d/crond restart // 以路径方式重启
service crond restart // 以服务的方式重启
表格: Crontab 字段与允许的值 (Linux Crontab)
字段 | 描述 | 允许的值 |
---|---|---|
分钟 | 一小时的第几分 | 0-59 |
小时 | 一天的第几小时 | 0-23 |
日期 | 一个月的的第几天 | 1-31 |
月份 | 一年的第几个月 | 1-12 |
周几 | 一周的第几天 | 0-6 |
命令 | 命令 | 可以被执行的任何命令 |
cron 的基本用法是在特定的时间执行一项任务,如下是 6 月 10 上午 8:30 执行 Full backup shell script。 要注意的是时间字段采用的是 24 小时制,如果是下午 8 点,则改写为 20 点
30 08 10 06 * /home/ramesh/full-backup
30 – 第 30 分钟
08 – 早上 8 点
10 – 10 号
06 – 第 6 个月 (6 月)
* – 一周的任何一天
下面的增量备份脚本每天执行两次。
每天于 11:00, 16:00 执行,逗号两侧的时间都会执行。
00 11,16 * * * /home/ramesh/bin/incremental-backup
00 – 第 0 分钟 (每小时开时)
11,16 – 早上 11 点与下午 4 点
* – 每天
* – 每个月
* – 一周的任何一天
下面这个例子是每天 9:00-16:00 检查数据库状态(包括周六)
00 09-18 * * * /home/ramesh/bin/check-db-status
00 – 第 0 分钟 (每小时开时)
09-18 – 9 点, 10 点, 11 点, 12 点, 下午 1 点, 下午 2 点, 下午 3 点, 下午 4 点, 下午 5 点, 下午 6 点
* – 每天
* – 每个月
* – 一周的任何一天
如果只想工作日执行此操作
00 09-18 * * 1-5 /home/ramesh/bin/check-db-status
00 – 第 0 分钟 (每小时开时)
09-18 – 9 点, 10 点, 11 点, 12 点, 下午 1 点, 下午 2 点, 下午 3 点, 下午 4 点, 下午 5 点, 下午 6 点
* – 每天
* – 每个月
1-5 – 周一, 周二, 周三, 周四和周五 (工作日)
理论情况下,没有每分钟都要执行的 shell,但下面这个例子,让我们更好的了解 crontab
* * * * * 命令
上面的例子对于其它四个字段同样试用
*/10 * * * * /home/ramesh/check-disk-space
有一些特殊的例子,可以用关键字替代上述五个字段 – reboot, midnight, yearly, hourly
Table: Cron special keywords and its meaning
Keyword | Equivalent |
---|---|
@yearly | 0 0 1 1 * |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | 重启时运行 |
下面的例子将在每一年的 1 月 1 日 0:00 执行
@yearly /home/ramesh/red-hat/bin/annual-maintenance
下面的例子将在每月 1 日 0:00 执行
@monthly /home/ramesh/suse/bin/tape-backup
下面的例子将在每天 0:00 执行
@daily /home/ramesh/arch-linux/bin/cleanup-logs "day started"
@reboot CMD
默认情况下,crontab 将向布置定时任务的管理员发送邮件,如果想重定向此用户,添加并更新 MAIL
ramesh@dev-db$ crontab -l
MAIL="ramesh"
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
如果不想任何人接收,则直接将 MAIL 置空
无法安排每秒执行,因为最小处理单元是分钟,另一方面,没有什么理由让我们每秒都执行一任务
上面的例子都是用绝对的路径
如果你想用相对的路径,设置环境变量可以在 crontab 增加
ramesh@dev-db$ crontab -l
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/ramesh
@yearly annual-maintenance
*/10 * * * * check-disk-space
除了直接编辑外,你也可以先在一个文件中编辑好任务,再导入
ramesh@dev-db$ crontab -l
no crontab for ramesh
$ cat cron-file.txt
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
ramesh@dev-db$ crontab cron-file.txt
ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
应用时要注意,此操作会删除原有的cron任务
$ cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {}
30 08 10 06 * sar 1 10 > /root/sysstat/data.txt
30 6 */10 * * ls
no crontab for bin
no crontab for daemon
no crontab for adm
no crontab for lp
no crontab for sync
no crontab for shutdown
no crontab for halt
no crontab for mail
no crontab for operator
no crontab for games
no crontab for ftp
no crontab for nobody
no crontab for systemd-network
no crontab for dbus
no crontab for polkitd
no crontab for sshd
no crontab for postfix
no crontab for chrony
no crontab for ntp
no crontab for tcpdump
no crontab for nscd