*
摘要
如果Monit或Cron没有启动您的脚本,则可能是PATH问题。 见下文。
*
我有两个主要文件:
这两个文件都是可执行的:
#!/usr/bin/env python
#!/bin/sh
然后:
chmod +x A.py
chmod +x B.sh
我配置Monit来检查 db.sqlite 文件的时间戳,如果时间戳大于1分钟(这意味着由于某些未知原因 A.py 更新功能已停止虽然python脚本可能仍在运行 - 这就是为什么我无法检查 A.py 状态),然后它将运行 B.sh shell脚本,重启 A.py 。
如果我在shell终端中手动运行脚本,那么一切正常。
但在Monit下似乎没有用。
我在Monit配置文件中添加以下内容(然后检查语法sudo monit -t
并重新加载配置sudo monit reload
):
check file db.sqlite with path /right_dir/db.sqlite
if timestamp > 1 minute then exec "/right_dir/restart.sh"
monit.log 报告:
error : 'db.sqlite' timestamp for /right_dir/db.sqlite failed -- current timestamp is ...
info : 'db.sqlite' exec: /right_dir/restart.sh
error : 'db.sqlite' timestamp for /right_dir/db.sqlite failed -- current timestamp is ...
error : 'db.sqlite' timestamp for /right_dir/db.sqlite failed -- current timestamp is ...
等......
我ps aux|grep A.py
但脚本没有运行。
我真的很感激任何帮助。
感谢您的时间,
阿斯
我尝试了一个简单的文件,使用 cron 而不是 monit :如果我在终端上运行脚本一切正常。 Cron没有。
仅供参考:我使用Anaconda(Python套件)
档案 A.py :
#!/usr/bin/env python
print("OK")
import matplotlib # this do block
import math # this do not block
while True:
pass
档案 B.sh :
/usr/bin/pkill -f A.py
nohup /right_path/A.py &
crontab的:
*/1 * * * * /right_path/B.sh
crontab启动后,我检查ps aux|grep A.py
。
此行不会阻止(我看到ps aux 的过程):
import math
此行阻止(我看不到进程):
import matplotlib
所以问题似乎与模块导入有关(有些是工作,有些则没有)。
可能是PATH / Env问题?
有什么想法吗?
这是一个PATH问题。
Cron没有看到完整的PATH,只看到了最小的子集。
试试自己:添加到crontab(crontab -e
)以下内容:
* * * * * env > /tmp/env.output
并将输出与终端中运行的env
命令进行比较。
它们可能不同。
解决方案是从您的终端复制完整的PATH并将其粘贴为 B.sh 的第二行(就像那样(以它为例,您的情况可能略有不同):
#!/bin/sh
PATH=/home/user/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# rest of the script
感谢这个帖子:https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work