计划任务,是任务在约定的时间执行已经计划好的工作。在 Linux 中,cron 服务可以根据配置文件约定的时间来执行特定的作务。
# crontab 命令选项
crontab [-u user] file | |
crontab [-u user] <-l, -r, -e> |
说明:
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,-u user 是指设定指定 user 的计划任务,这个前提是你必须要有其权限 (比如说是 root) 才能够指定他人的计划任务。如果不使用 -u user 的话,就是表示设定自己的计划任务。
参数:
-l 列出某个用户的计划任务
- r 删除某个用户的计划任务
- e 编辑某个用户的计划任务
# cron 文件语法
可用 crontab -e 命令来编辑,编辑的是 /var/spool/cron 下对应用户的 cron 文件,也可以直接修改 /etc/crontab 文件。具体格式如下:
# Example of job definition: | |
# .---------------- minute (0 - 59) | |
# | .-------------- hour (0 - 23) | |
# | | .------------ day of month (1 - 31) | |
# | | | .---------- month (1 - 12) OR jan,feb,mar,apr ... | |
# | | | | .-------- day of week (0 - 6) (Sunday=0 or 7) OR | |
# | | | | | sun,mon,tue,wed,thu,fri,sat | |
# * * * * * user-name command to be executed | |
Minute 每个小时的第几分钟执行该任务 | |
Hour 每天的第几个小时执行该任务 | |
Day 每月的第几天执行该任务 | |
Month 每年的第几个月执行该任务 | |
Week 每周的第几天执行该任务,0表示周日 | |
Command 指定要执行的程序、脚本或命令 |
除了 Command 是必须指定的字段以外,其它字段皆为可选。对于不指定的字段,要用 “*” 来填补其位置。
“*”代表取值范围内的数字, | |
“/”代表”每”, | |
“-”代表从某个数字到某个数字, | |
“,”分开几个离散的数字 |
# 常见 cron 示例
10 * * * * command #每小时的第 10 分钟执行一次 command | |
30 5 * * * command #每天的 5:30 执行 command | |
30 7 8 * * command #每月 8 号的 7:30 分执行 command | |
30 5 8 6 * command #每年 6 月 8 日 5:30 执行 command | |
30 6 * * 0 command #每星期日的 6:30 执行 command | |
30 3 2,3 * * command #每月 2 号及 3 号的 3:30 执行 command | |
25 8-11 * * * command #每天 8-11 点的第 25 分钟执行 command | |
*/15 * * * * command #每 15 分钟执行一次 command | |
30 6 */10 * * command #每个月每隔 10 天 6:30 执行 command (即每月的 1、11、21、31 日) |
# cron 配置
cron 的主配置文件是 /etc/crontab,它包括下面几行:
SHELL=/bin/bash | |
PATH=/sbin:/bin:/usr/sbin:/usr/bin | |
MAILTO=root | |
HOME=/ | |
#run-parts | |
01 * * * * root run-parts /etc/cron.hourly | |
02 4 * * * root run-parts /etc/cron.daily | |
22 4 * * 0 root run-parts /etc/cron.weekly | |
42 4 1 * * root run-parts /etc/cron.monthly |
前四行是用来配置 cron 任务运行环境的变量:
1.SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);
2.PATH 变量定义用来执行命令的路径;
3.MAILTO 变量定义 cron 任务输出被邮件通知的用户名(如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出);
4.HOME 变量可以用来设置在执行命令或脚本时使用的主目录。
run-parts 用来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周或每月执行。这些目录中的文件应该是 shell 脚本。
使用者权限文件:
/etc/cron.deny #该文件中所列用户不允许使用 crontab 命令 | |
/etc/cron.allow #该文件中所列用户允许使用 crontab 命令 | |
/var/spool/cron/ #所有用户 crontab 文件存放的目录,以用户名命名 |
# 注意事项
1. 脚本中涉及文件路径时写全局路径;
2. 脚本执行要用到 java 或其他环境变量时,通过 source 命令引入环境变量
cat start_cbp.sh | |
#!/bin/sh | |
source /etc/profile | |
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf | |
/usr/local/jboss-4.0.5/bin/run.sh -c mev & |
3. 手动执行脚本 OK,但是 crontab 不执行时可以尝试在 crontab 中直接引入环境变量解决问题
0 * * * * . /etc/profile;/bin/sh /var/www/restart_audit.sh |
4. 注意清理系统用户的邮件日志,如果想忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1 |
说明:/dev/null 可以理解为黑洞,可以无限往里面扔垃圾,所以这个相当于不输出了。1 是标准输出,2 是标准错误输出,2>&1 的意思是将错误输出的内容也输出到标准输出流中,就是说将该脚本所有的输出都送到标准输出流中。
5. 谨慎执行 crontab -r,它会从 Crontab 目录(/var/spool/cron)中删除用户的 Crontab 文件,删除了该用户的所有 crontab 都没了。
6. 在 crontab 中 % 是有特殊含义的,表示换行的意思。如果要用的话必须进行转义 %,如经常用的 date‘+% Y% m% d’在 crontab 里是不会执行的,应该换成 date‘+% Y% m% d’。