Linux定时任务crontab设置方法

crontab命令格式和参数

crontab [ -u user ] [ -i ] { -e | -l | -r }
    -e  (edit user's crontab)编辑某个用户的crontab文件内容
    -l  (list user's crontab)显示某个用户的crontab文件内容
    -r  (delete user's crontab)删除某个用户的crontab文件内容
    -i  (prompt before deleting user's crontab)与-r配合,删除前提示

crontab的文件格式

分钟 小时 日 月 星期 要运行的命令

  • 第1列分钟1~59
  • 第2列小时1~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~6(0表示星期天)
  • 第6列要运行的命令

创建一个新任务

  1. crontab -e打开编辑器对crontab文件进行编辑;
  2. 在文件中添加新的一行并保存:
# 每分钟打印当前时间到1.log中
* * * * * date >> 1.log
  1. 使用 crontab -l 查看文件内容,发现该定时任务已被写入。任务应该可以正常执行了。

注意事项

执行环境变量

如果是执行自己写的脚本或者程序,要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量;而系统自动执行任务调度时,跟shell所在环境不同,许多环境变量需要手动设置。

解决方案:

  • 脚本中涉及文件路径时写全局路径;
  • 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
  • 当手动执行脚本OK,但是crontab死活不执行时,很可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /home/pi/myscripts.sh

用户邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1” 表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过crontab –u root –e来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

常见使用实例

  • 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
  • 每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
  • 每晚的21:30执行
30 21 * * * myCommand
  • 每小时执行
*/60 * * * * myCommand
0 * * * * myCommand

其他

  • 打开/关闭/重启crontab服务:
service cron start/stop/restart
/etc/init.d/cron start/stop/restart
  • 当crontab失效时,可以尝试重启crontab服务。
  • 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%。
  • 更新系统时间时区后需要重启cron。
目录