近期需要在服务器上跑一个python脚本,但是发现单独使用python命令去调用这个脚本是可以的,但是一旦加入到定时任务中就不行了。找了很多原因,现总结如下。先给出我的运行时脚本内容和定时任务:
1 |
|
crontab -e
编辑定时任务,本文的定时任务为每分钟执行一次:
1 | * * * * * /root/scripts/daily_run.sh |
使用Shell脚本来调用Python脚本
为什么要写这个呢?因为Python脚本中如果包含了对文件的操作,那么这个python脚本的目录默认就定位了/home/username/
下,因此很多路径都会出错,因此把这些操作使用Shell脚本封装起来就能按照Python脚本中定义的路径去操作了。
没有指明运行时环境
网上有一种说法是需要在运行时指定脚本的运行时环境,即加入以下一行代码到daily_run.sh
中:
1 | if [ -f ~/.bash_profile ]; |
但是通过本文的实践可以看到,不加这个也是可以的。但是如果你运行不了程序,其他原因都找遍了,可以试试这个。
Shell脚本中的命令不是全路径
可以看到本文的Shell脚本中echo
的写法是/bin/echo
,这里是需要指明全路径的。否则很容易出现找不到命令的情况,从而导致任务执行失败。
Shell脚本的权限问题*
这个问题是所有人都容易忽略的问题,当你创建完一个用于执行定时任务的脚本时候,你一定要修改它的权限为可执行,最简单的方式就是chmod 777 daily_run.sh
。本文找了好久的BUG就是因为没有给daily_run.sh
脚本赋上可执行权限。
总结
针对定时任务失败的问题,首先需要弄懂是任务不能执行还是任务被定时任务调度器执行了,但是脚本里面的内容执行失败了,这样就可以针对性地定位问题和给出解决方案。