如何快速测试你的crontab配置是否正确

如何快速测试你的crontab配置是否正确

crontab 配置面临的问题: 做过 linux 开发运维的人都知道,crontab 给我们提供了很好的的定时任务工具。但是,绝大多数人都会在修改 crontab 时犯错,经常出现配置完成后,没有生效的情况。即使你是老鸟,也难免出现问题。

crontab 时间格式问题

crontab 的语法虽然简单,但由于缺乏有效的验证机制,经常出现配置的执行时间跟自己的期望不符。比如,我们希望每月一号晚上 11:00 执行一个任务,总不能等 30 天以后在验证吧?典型写法是这样:

1
0 23 1 * * /usr/bin/somescript

但怎样才能确定这个写法没问题呢?其实很简单,通过这个crontab 网站或者https://crontab.devopsroles.com/即可验证:

通过输入表达式,不仅可以清晰的解读每月、每天、每分、每时、每周的任务,而且还可以通过点击 next 按钮,进行仿真模拟。

命令环境变量问题

我们经常遇到,在 shell 下执行好好地脚本,配置到 crontab 时,就失效了(时间格式是没问题的)。这个问题是由于 crontab 的执行环境变量,很大可能与你当前的 shell 环境变量不一致。比如 PATH 环境变量不一致,会导致某些命令找不到。 如何排查此类问题? 我们需要做两件事: 打开 crontab 编辑器

1
crontab -e

将时间改成每分钟执行一次,同时增加重定向命令,下面这段代码将脚本执行所有错误和正常结果输出到 /tmp/cron_debug_log.log 中,

1
* * * * * /path/to/prog var1 var2 >>/tmp/cron_debug_log.log 2>&1

等待一分钟后,再次查看 /tmp/cron_debug_log.log 即可。

此外还有一些其他方法,具体可参考 StackOverflow

路径问题

还有一类问题是相对路径问题,就是脚本只能在某个目录(比如工程目录)执行。此时需要先进入相应目录,再执行脚本。这样略显啰嗦,更简单的办法是,直接在shell脚本内部修改工作目录。只需在脚本前面增加如下几条命令,即可将工作目录切换到当前脚本所在目录。

1
2
3
4
#/bin/bash
project_path=$(cd `dirname $0`; pwd)
project_name="${project_path##*/}"
cd $project_path

已经bash下测试通过。

Rating: