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
文章评论