【问题标题】:cronjob text output cut offcronjob 文本输出被切断
【发布时间】:2019-04-10 08:24:07
【问题描述】:

我有一个每 2 小时运行一次 python 脚本的 cronjob。脚本本身可以运行超过 2 小时。这就是为什么我尝试检测脚本是否已经在运行。系统是FreeBSD机器。我尝试使用以下功能进行检测:

def script_already_running(script_name,console_logger,parameter=None):
    """
    checks if the script is already running, this is done by syscall and parsing the output. Parameters of the script can be distinguished as well
    """
    ps = subprocess.Popen("ps aux", shell=True, stdout=subprocess.PIPE)
    process_strings = ps.stdout.read().decode(encoding="utf-8",errors="strict")
    ps.stdout.close()
    ps.wait()
    console_logger.info(process_strings)
    # print(process_strings)
    # print(script_name)

    if script_name in process_strings and parameter is None:
        script_running = True
    elif script_name in process_strings and parameter is not None:
        if parameter in process_strings:
            script_running = True
        else:
            script_running = False
    else:
        script_running = False

    return script_running

这个函数是从另一个脚本调用的。 script_name 是调用脚本的名称(带路径),console_logger 是 python logging 对象。当我直接从 shell 执行所有内容时,一切正常。该函数打印ps aux 的输出,看起来像这样(我删除了不必要的其余部分)

USER    PID %CPU %MEM    VSZ    RSS TT  STAT STARTED       TIME COMMAND
mysql  7225 95.8  1.1 530948 190652  -  IJ   Sun12   3750:03.47 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/test_jail.err --pid-
user  56261 22.8  0.4 195936  60040  0  S+J  22:14      0:02.74 python3 testscript.py (python3.6)
user  50756  0.6  0.5 220976  78068  -  SsJ  21:20      3:25.17 python3 /home/user/immoquery/src/testscript.py (python3.6)

所以你可以看到它永远不会真正运行,因为当它启动时它总是会检测到自己正在运行。这是我将来需要解决的另一个问题。但是当我查看日志时,cronjob 创建ps aux 的输出看起来像这样:

USER    PID %CPU %MEM     VSZ     RSS TT  STAT STARTED       TIME COMMAND
mysql  7225 92,4  1,3  530948  224528  -  IJ   So.12   3179:35,23 /usr/local/li
user  80177 24,9  0,4  196016   60184  -  SsJ  09:20      0:02,83 python3 /home
user  68285  0,5  7,2 1343792 1198784  -  SsJ  07:20      6:46,38 python3 /home

检查交付false,因为它在ps aux 的返回字符串中找不到脚本名称。字符串不知何故被切断了。

这是 cron 文件的内容:

SHELL=/usr/local/bin/zsh
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"

# used to execute immobilienscout24 kaufangebote
#minute hour    mday    month   wday    command
20       7,9,11,13,15,17,19,21,23 *       *       *      python3 /home/user/immoquery/src/testscript.py >> /home/user/testscript.log 2>&1

有人知道如何解决这个问题吗?为什么进程输出被切断?是否有虚拟屏幕尺寸或其他相关内容?

【问题讨论】:

  • 使用ps auxww 获取完整输出。

标签: python cron freebsd


【解决方案1】:

要从ps 获取完整的命令行,请使用-ww(两个双我们)。 pgrep 是更好的解决方案。

使用锁文件可能更好(在本地文件系统上,例如在/var/run 甚至/tmp 某处)。

【讨论】:

    【解决方案2】:

    您可以通过以下方式保持简单:

    0 */2 * * *  if ! pgrep -f your-script 2>&1 >/dev/null; then your-script; fi
    

    它的工作方式是使用pgrep 检查进程是否仍在运行,如果没有,它将运行您的脚本。

    【讨论】:

    • 我试过这个很棒,因为它不需要更改 python 级别。尽管如此,最后还是缺少fi
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多