![为什么不通过 Cron 启动作业?](https://linux22.com/image/133198/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E9%80%9A%E8%BF%87%20Cron%20%E5%90%AF%E5%8A%A8%E4%BD%9C%E4%B8%9A%EF%BC%9F.png)
我确实写了shell脚本
#!/bin/bash
#clear
#echo "Good morning, world."
source activate python36
python /opt/project1/Table_Control.py opt/project1/connection.yaml
当我在 cron 中写入之后
# job
1 19 * * * /opt/project1/start.sh
并尝试了其他其他变体
# job
1 19 * * * cd /opt/project1/ && ./start.sh
检查并得到结果
May 11 19:01:01 server01 CROND[127428]: (root) CMD (/opt/project1/start.sh)
和
May 11 19:43:01 server01 CROND[13797]: (root) CMD (cd /opt/project1/ && ./start.sh)
但是工作必须给我发电子邮件,还没有收到任何电子邮件((
是否运行了shell脚本
/opt/project1/start.sh
工作很好。
如何解决这个问题?
答案1
在编写稍后由 cron 执行的脚本时,一个常见的错误是您假设该脚本将具有与您登录并开发它时完全相同的环境。还没有!
这个答案进一步解释检查流程环境和调试的差异。
然而,您的行source activate python36
假设 activate 位于当前目录中,还有一个假设 python
位于 cron 任务的路径中。
将您的命令放入其自己的子 shell 中,并将所有内容重定向到日志文件以查看发生了什么。
例如。
1 19 * * * (cd /opt/project1/ && ./start.sh) >/tmp/pr1.log 2>&1
答案2
通常,为了调试此类问题,为每一行添加一些日志记录可能会很方便。像这样:
源激活 python36 >> /tmp/1.log 2>&1
python opt/project1/Table_Control.py opt/project1/connection.yaml >> /tmp/2.log 2>&1
您还可以设置 cron 任务每分钟启动一次,这样您就不需要等待。应该有帮助。
答案3
改变后
python opt/project1/Table_Control.py opt/project1/connection.yaml >> /tmp/2.log 2>&1
在日志中我确实发现错误Python没有找到请求python模块。
我确实改变了
python opt/project1/Table_Control.py opt/project1/connection.yaml >> /tmp/2.log 2>&1
到
/data/Anaconda2-4.4.0/envs/python36/bin/python opt/project1/Table_Control.py opt/project1/connection.yaml >> Table_Control.log >&1
附注
现在工作得很好,但我不明白为什么如果我从 shell 脚本运行 - 没有错误,但如果从 cron 作业运行确实返回错误没有找到请求 python 模块...