使用crontab进行定时任务时的一次差错排查

发布于 2021-03-21  95 次阅读


懒人如我,有很多脚本运行在服务器上,其中有的脚本是要定期(每天或一周两次)执行的,这时候就应当使用crontab配置定时任务。最近转移服务器后,某个脚本突然不能用了,让我排查了好久。

确认路径

首先crontab是无法获得环境变量的,因此我们在脚本中,无论是解释器,还是运行的脚本本身,又或是其他运行的文件,都需要写绝对路径。

查看日志

ubuntu下crontab的日志在/var/log/syslog处,查看日志可以看到crontab本身是否正常执行了命令。

格式化报错至文件日志

在crontab命令中写:

* * * * * /path/for/your/interpreter /path/for/your/script argv1 argv2 >> yourLog.log 2>&1

因为crontab是后台运行的,因此不会看到运行的报错,并且因为其无法获得环境变量,因此crontab运行时的结果可能与直接运行脚本不一致。 上面的1 代表 standard output (stdout). The 2 代表 standard error (stderr).以及,没有出现的0 代表stdin(标准输入)。

2>&1则代表把error重定向到运行结果输出的位置,同时,因为使用了 >> 将结果重定向到了日志文件,因此运行error也会追加到日志文件中。

在我的脚本中,报了这样一个error:FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'.

查了一下StackOverflow发现这是没有配置geckodriver的缘故。

可是我明明配置了啊。

突然想起来,crontab无法得到环境变量,因此要在代码中显式地指定geckodriver的位置,因为我刚刚转移主机,因此代码中指定的路径变了,导致crontab中一直无法执行。

至此,排查结束。

总结

后台运行代码时,将运行结果,尤其是报错输出到日志文件是非常重要的一步!也是必须养成的好习惯!


你好哇!欢迎来到雷公马碎碎念的地方:)