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
posted @ 2018-12-18 10:12  xuejianbest  阅读(425)  评论(0编辑  收藏  举报