crontab使用记录

crontab用法

crontab命令如何使用网上讲得很多,我就简单说一下它是用来干嘛的,以及常用的一些命令。
这个命令用来定时执行某些任务,任务可能是一些shell脚本或者其他命令。
通过crontab -e用户可以编辑定时任务文件,文件格式有着严格的要求:

分钟小时日期月份星期命令
0-590-231-311-120-7(0和7表示星期天)

文件中以#开头的是注释,除此之外,每一行代表一个任务,任务格式如上表所示。
前五列每一列中允许的取值除了上表对应范围中的数字之外,还有以下几种(其中m,n代表数字):

  • * (任意数字)
  • /n (每隔n时间段)
  • m,n (取值是m和n)
  • m-n (取值是m到n)

例如,“每周五的下午4:00到5:00每隔10分钟调用一次ls命令”的任务格式如下:
*/10 4-5 * * 5 ls
需要注意的是:隔10分钟可以写成/10,也可以写成*/10,千万别认为*/10是两列

此外,可以使用crontab -l来查看当前用户的所有crontab 任务

遇到的问题

  1. bad command. errors in crontab file, can't install...
    出现这种问题主要是因为任务格式有问题,注意任务只有六列,前五列都是定时设置,最后一列是要运行的命令(命令中间可以有空格)。仔细检查是不是列数不匹配或者使用了不合法的取值;

  2. 任务保存成功之后,无法定时执行,但是手动执行没问题
    这是因为手动执行的时候,shell脚本知道当前的执行环境,而对于crontab而言,它不知道该脚本的任何环境信息,如路径等。所以如果脚本中使用了相对路径,就会出现这种情况,解决方案很简单:所有脚本可能使用到的路径都写成绝对路径即可
    分享一个实际的问题吧。有一个 shell 脚本A,该脚本执行一个 py 脚本B,并将 py 的输出重定向到某文件C,最后将文件C当做邮件附件发送出去。shell 脚本A中的所有路径,如py脚本B的路径以及,文件C的路径均使用了绝对路径。此时,使用 crontab 添加一个定时任务,发现无法执行成功,但是手动执行没有问题,之后重新设置时间测试的时候也没问题。看这描述,应该是shell 脚本某处使用了相对路径,但是我已经shell 脚本中的所有路径都写成了绝对路径,而且在手动执行之后再次重新设置 crontab 执行也没问题。后来在将 crontab 的输出重定向到日志文件中的时候才发现,是py脚本中使用了相对路径,导致第一次执行该脚本没有产生相应的文件C,无法发送邮件;但是之后我手动执行的时候由于是在脚本所在目录执行的,所以相对路径没有问题,这时产生了文件C。当我再次重新设置定时任务进行测试的时候(设置到当前时间一分钟后),py 脚本仍然出错,但是这个时候C文件已经存在(手动执行时产生),py 脚本出错并不影响 shell 脚本继续执行,shell 脚本接着去找C,可以找到,所以仍然可以正常发送邮件。
    在该shell脚本中,将py文件的输出重定向到文件C中和将C文件当做邮件内容发送出去是两条语句,并没有使用&&,所以一条语句执行失败不会影响其他语句。
    经验教训就是:日志大法好

参考资料

crontab 定时任务
Ubuntu 14.04 使用 Cron 实现计划任务
wiki
分享一次Linux任务计划crontab不执行的问题排查过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值