[Linux]实现定时任务(CronTab)介绍举例以及注意事项

2021-05-24 120点热度 0人点赞 0条评论

Linux内置的crontab可以实现丰富的定时任务,功能很全面,可以通过crontab在指定的时间间隔(分钟、小时、日、月、周/星期及以上的任意组合)执行指定的程序(如Shell脚本等)

命令格式介绍

crontab [-u username]    //省略用户表表示操作当前用户的crontab
    -e      (编辑计划任务列表)
    -l      (列出计划任务列表里的命令)
    -r      (删除计划任务列表)

例如直接输入crontab -e进入当前用户的计划任务列表编辑状态,是常见的vim界面(编辑、保存等都是vim指定,这里不做介绍了)。

crontab -e出现的vim界面如下

#每天0点5份,指定备份的脚本
5 0 * * * /opt/backup.sh

#每天0点和12点,执行letsencrypt的证书续期
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && /opt/renew_cert.sh

每行是一条命令(示例中,我们为每行都增加了注释,方便后续查看理解)

crontab的命令构成为 时间+动作,其时间有分、时、日、月、周/星期五种,

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

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

操作符有

  • * 取值范围内的所有数字
  • / 每过多少个数字
  • - 从X到Z
  • 散列数字

使用示例

#每分钟执行一次command命令或脚本
* * * * * /path/to/command

#每三天的1点21分 执行一次
21 1 */3 * * /path/to/command

#每天的1点21分执行一次
21 1 * * * /path/to/command

#每隔2小时的12分同步一次时间
12 */2 * * * /usr/sbin/ntpdate ntp.aliyun.com


#每晚的21:30重启apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart

#每隔一小时执行一次 
00 * * * * command
# or (/表示频率)
* */1 * * * command 

#每小时的15和30分各执行一次 (,表示并列)
15,45 * * * * command

#在每天上午 8- 11时中间每小时 15 ,45分各执行一次
15,45 8-11 * * * command (-表示范围)

#每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command


#每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command

#每隔3分钟
*/3 * * * * command

#每月1号执行
0 0 1 * * command
#比如每月1号0点清空日志
0 0 1 * * cat /dev/null > /opt/xxx.log

#每年执行
0 0 1 1 * command

#开机启动执行
@reboot Run once, at startup.
#据说reboot执行的时候,网络还没有准备好,所以先等待60s
@reboot sleep 60 && my_script.sh

日志查询

如果比较重要的脚本,我想知道脚本有没有运行,或者查看脚本执行的结果,可以查看crontab的日志

crontab产生的脚本一般会在:

  • /var/log/cron
  • /var/spool/mail/<用户名>
  • /var/spool/cron/crontabs/<用户名>

每次执行cron会发这么一个邮件的,以上路径都可以看下(可能因为linux的版本不同,日志的路径稍有不同)

如果我不想让cron指定的脚本产生输出和日志,可以编辑crontab -e,这样做:

# 不产生输出和日志
0 * * * * /home/script >/dev/null 2>&1

注意事项

crontab里面的执行脚本,以及执行的脚本里面的命令,最好都写全路径,因为在指定crontab的时候,可能并没有export一些常用命令执行的PATH

例如:

#zip打包某个文件夹备份,zip是后来安装的,很可能直接shell可以执行,放到crontab里无法指定,找不到zip可执行文件
21 1 * * * zip xxx

#所以要写全路径
21 1 * * * /usr/sbin/zip xxx

#包括如果执行了backup.sh,注意backup.sh里面有没有可执行文件,需要的话,写全路径,或者实现export
21 1 * * * /opt/backup.sh

backup.sh(oracle备份)脚本举例:

#!/bin/sh

#预先export一些环境变量
#export LANG="en_SU.UTF-8"
#export NLS_LANG="Simplified Chinese_china".ZHS16GBK
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export ORACLE_BASE=/home/oracle/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib


# 后面省略
exp USER/[email protected]:1521/orcl FILE=/home/oracle/backup.dmp FULL=n

 

admin

这个人很懒,什么都没留下

文章评论

*

code