Monit和文件时间戳错误。相关脚本无法启动

时间:2016-07-20 13:08:47

标签: python sqlite shell timestamp monit

*

  

摘要

     

如果Monit或Cron没有启动您的脚本,则可能是PATH问题。   见下文。

*

我有两个主要文件:

  1. 第一个, A.py ,是Python中的主要脚本,它连续更新sqlite数据库 db.sqlite (它应该永远不会停止);
  2. 第二个, B.sh ,是一个shell脚本,如果需要的话 - 杀死并重新启动第一个脚本(它将在Monit预先配置的条件下运行 - 见下文)
  3. 这两个文件都是可执行的:

    • A.py 第一行#!/usr/bin/env python
    • B.sh 第一行#!/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

0 个答案:

没有答案