crontab是cron的配置文件,可将其成为作业列表。
crontab定时执行Shell脚本
常用指令:
#省略-u username表表示操作当前用户的
crontab -u username
#编辑工作表([-u username]可以缺省)
crontab -u username -e
#列出工作表里的命令([-u username]可以缺省)
crontab -u username -l
#删除工作列表
crontab -u username -r
定时执行Shell脚本示例:
# 开启服务,首次开启需要选择编辑器,按需选取即可
sudo service crontab restart
# 继续输入以下指令进行工作表配置
crontab -u username -e
执行后,打开编辑器可以看到以下提示信息:
设定定时任务:
* * * * * test.sh
#从左到右,解释一下如果要更改执行时间,怎么修改上面的五个星号
# 第一个*代表分,可以填写0-59中的任意数值
# 第二个*代表时,可以填写0-23中的任意数值
# 第三个*代表天,可以填1-31中的任意数值
# 第四个*代表月,可以填1-12中的任意数值,或者jan,feb...
# 第五个*代表一星期中的某一天,可以填0-6中的任意数值,其中0代表星期天
#下面以每周的1,3,5早上9点执行tesh.sh为例
0 9 * * 1,3,5 test.sh
打开cron的log功能
方便调试,我们还需要设置让cron的log功能开启。
#打开conf文件,# 取消cron.log行注释
sudo vim /etc/rsyslog.d/50-default.conf
# 重启服务
sudo service rsyslog restart
# 查看cron.log
vim /var/log/cron.log
踩坑记录加解决方案
尝试定时运行后,发现没有执行成功,查看log之后,看到以下错误。
(CRON) info (No MTA installed, discarding output)
查询了一下,是因为我的定时脚本包含smtp发送邮件的功能,而Ubuntu系统不含MTA(Mail Transfer Agent),因此需要通过sudo apt-get install postfix
安装邮件服务。
安装后,发现脚本依然没有执行成功,log信息过于简单,还是需要查看标准输出信息和执行时的错误信息才方便debug。
#修改示例脚本
0 9 * * 1,3,5 test.sh>test.out 2>&1
其中>test.out
表示将标准输出重定向写入到test.out文件中。2>&1
表示将错误输出重定向到标准输出。
加入以上代码,则错误提示和脚本的标准输出都会打印到test.out中,也就是说,test.sh执行完成后,test.out中能看到所有输出的信息。