Crontab执行脚本失效原因分析

图片来源于orebibou.com

近期需要在服务器上跑一个python脚本,但是发现单独使用python命令去调用这个脚本是可以的,但是一旦加入到定时任务中就不行了。找了很多原因,现总结如下。先给出我的运行时脚本内容和定时任务:

1
2
#!/bin/bash
/bin/echo "Hello World!">>/root/hello.txt

crontab -e编辑定时任务,本文的定时任务为每分钟执行一次:

1
* * * * * /root/scripts/daily_run.sh

使用Shell脚本来调用Python脚本

为什么要写这个呢?因为Python脚本中如果包含了对文件的操作,那么这个python脚本的目录默认就定位了/home/username/下,因此很多路径都会出错,因此把这些操作使用Shell脚本封装起来就能按照Python脚本中定义的路径去操作了。

没有指明运行时环境

网上有一种说法是需要在运行时指定脚本的运行时环境,即加入以下一行代码到daily_run.sh中:

1
2
3
4
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi

但是通过本文的实践可以看到,不加这个也是可以的。但是如果你运行不了程序,其他原因都找遍了,可以试试这个。

Shell脚本中的命令不是全路径

可以看到本文的Shell脚本中echo的写法是/bin/echo,这里是需要指明全路径的。否则很容易出现找不到命令的情况,从而导致任务执行失败。

Shell脚本的权限问题*

这个问题是所有人都容易忽略的问题,当你创建完一个用于执行定时任务的脚本时候,你一定要修改它的权限为可执行,最简单的方式就是chmod 777 daily_run.sh。本文找了好久的BUG就是因为没有给daily_run.sh脚本赋上可执行权限。

总结

针对定时任务失败的问题,首先需要弄懂是任务不能执行还是任务被定时任务调度器执行了,但是脚本里面的内容执行失败了,这样就可以针对性地定位问题和给出解决方案。

分享到