shell命令:crontab 定时任务
参考 crontab定时任务最佳实践
查看服务状态:
service crond status
使用crontab能够定时执行命令和脚本:
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
-u # 指定操作的为哪个用户的定时任务规则
-e (edit user's crontab) # 编辑用户的定时任务规则,不指定用户为当前用户
-l (list user's crontab) # 列出用户的定时任务规则,不指定用户为当前用户
-r (delete user's crontab)# 删除用户的定时任务规则,不指定用户为当前用户,慎用,删除前先保存
-i (prompt before deleting user's crontab)# 删除用户定时任务规则前确认
举例:
crontab -u ubuntu -l # 列出ubuntu用户的定时任务规则
# ==================以下为输出,不包括此行==============================
# test
# 0,5,10,15,20,25,30,35,40,45,50,55 * * * * echo `date` >> /home/ubuntu/cron_out
# 每小时整开始,每隔五分钟执行一次下面的命令
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/bin/python3 /home/ubuntu/fr.py > /home/ubuntu/crontab_log/fr.log 2>&1
# ==================以上为输出,不包括此行==============================
# 编辑当前用户的定时任务规则
export EDITOR=vi # 设置系统默认editor为vi
crontab -e # 编辑当前用户的定时任务列表,执行会要求选择编辑器,可以通过EDITOR变量指定默认
# 每次用 crontab -e 编辑完定时任务规则并保存退出后,
# 会出现以下提示,说明规则格式没问题,并开始安装生效
crontab: installing new crontab
也可以编辑一个文本文件,里面写好定时任务规则,然后用以下命令使规则生效:
crontab [-u user] file # 会将当前文件复制到/var/spool/cron/crontabs/用户名/ 目录下
# 实际规则文件保存位置:
/var/spool/cron/crontabs/ubuntu # 此文件记录了ubuntu用户的所有定时任务
/var/spool/cron/crontabs/root # 此文件记录了root用户的所有定时任务
注意:
定时任务中的打印到控制台会失效,若安装了邮件工具,会以发邮件的形式通知执行定时任务时的标准输出和标准出错。
所以最好将命令的输出重定向到一个文件方便查看。
有时crontab执行命令会将用户home目录当做当前目录,所以推荐用以下方式提交命令:
* * * * * pushd /path/command && ./command && popd
可以通过日志文件查看crontab任务的执行情况:
cat /var/log/cron
下面讲一下定时任务规则的格式:
分 时 日 月 星期 要运行的命令
# 前面5个域用空格分隔
- 第1列分钟0~59
- 第2列小时0~23(0表示子夜)
- 第3列日1~31
- 第4列月1~12
- 第5列星期0~7(0和7表示星期天)
- 第6列要运行的命令
举例:
# 每1分钟执行一次myCommand
* * * * * myCommand
# 每小时的第3和第15分钟执行
3,15 * * * * myCommand
# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
# 每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
# 每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
# 每月1、10、22日的04:45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
# 每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
# 每天18:00至23:00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
# 每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
# 每一小时重启smb
* */1 * * * /etc/init.d/smb restart
# 晚上11点到早上7点之间,每隔一小时重启smb
0 23-7 * * * /etc/init.d/smb restart
更新系统时间、时区后需要重启cron,在ubuntu中服务名为cron:
service cron restart
# 或
sudo /etc/init.d/cron restart
注意:
在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%。
如经常用的 date ‘+%Y%m%d’ 在crontab里是不会执行的,应该换成date ‘+%Y%m%d’ 。
当手动执行脚本正常,但是crontab死活不执行时,很可能是环境变量问题,可尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile; /bin/sh go.sh