【问题标题】:Python Subprocess returns non-zero exit status only in cronPython 子进程仅在 cron 中返回非零退出状态
【发布时间】:2012-04-21 10:04:10
【问题描述】:

我有一个 Python 脚本,用于管理一系列 CasperJS 任务并处理结果。它从命令行运行良好,但是当我在 cron 中运行脚本时,出现错误:

CalledProcessError: Command '['/path/to/casperjs', '/path/to/doSomething.js', 'args']' returned non-zero exit status 1

在 Python 中,我调用 CasperJS:

response = subprocess.check_output(['/path/to/casperjs', '/path/to/doSomething.js', 'args'], shell=True)

我也尝试过shell=FalsePopen,但我得到了相同的结果。我还尝试将整个命令设为字符串(而不是列表),但这也无济于事。

运行 '/path/to/casperjs /path/to/doSomething.js args' 在 shell 中运行时返回退出代码 0。

我还在我的 crontab 中添加了 PATH=/usr/bin:/bin:/sbin:/usr/local/bin,但无济于事。 (正如this question 中所建议的那样。)

任何想法为什么我只在 cron 中收到此错误?谢谢!!

编辑:根据下面的答案,设置shell=Falsestderr=subprocess.STDOUT 使一切正常...

【问题讨论】:

    标签: python subprocess crontab casperjs


    【解决方案1】:

    除了 stdout 之外,您还应该尝试捕获 stderr,以便准确找出程序失败的原因(假设它确实为您打印了一些错误)

    cmd = ['/path/to/casperjs', '/path/to/doSomething.js', 'args']
    response = subprocess.check_output(cmd, 
                    shell=True,
                    stderr=subprocess.STDOUT)
    

    【讨论】:

    • 我会补充一点,“这个命令在我手动运行但不在 cron/supervisor/upstart/... 下运行时有效”的最常见原因是环境变量 - 并不总是 PATH - 不同或缺失。
    • 是的,我检查了所有的环境变量,但是设置了shell=False 并添加了stderr=subprocess.STDOUT,现在一切都神奇地工作了吗?!!
    • @mattbornski:是的,我同意。要么就是这样,要么进程在 crontab 设置为的任何用户下运行时遇到问题。我不想过多推测,而是尝试找出真正的错误可能是什么
    • @arboc7:有时,最好不要质疑为什么,当它工作时。很高兴我能间接提供帮助。
    • @jdi 捕获 stderr 并不困扰我——捕获它可以解决问题的事实让我感到困扰。似乎不应该解决“非零退出状态”问题。但我今天会尽量不看礼物马的嘴巴,只是顺其自然。
    猜你喜欢
    • 2012-01-17
    • 2020-10-24
    • 2015-03-11
    • 2014-09-23
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2013-12-23
    相关资源
    最近更新 更多