【问题标题】:Using a shell subprocess to determine whether a second script is still running使用 shell 子进程确定第二个脚本是否仍在运行
【发布时间】:2015-01-30 22:26:44
【问题描述】:

我有两个半依赖的 python 脚本。 ScriptA 应该运行,即使 ScriptB 不是。 ScriptB 应该只在 ScriptA 正在运行时继续。

我的想法是这样的

 proc = subprocess.Popen(["ps aux | grep scriptA.py | wc -l"],shell=True,STDOUT=X)

并以某种方式检查结果是否为2(因为它会是1,由于grep)。

我在 python 控制台中测试时收到2,但我很难保存标准输出。尝试使用stdout=variable,但失败了。当我使用string 时,子进程失败(使用c2pwrite = stdout.fileno()),当使用int 时,它始终为0。

【问题讨论】:

标签: python linux shell subprocess stdout


【解决方案1】:

你可以这样做:

import subprocess

process = subprocess.Popen(['pgrep', 'scriptA.py'], stdout=subprocess.PIPE)

process.wait()

if not process.returncode:
    print "Process running"
else:
    print "Process not running"

在这里,我使用 pgrep 来搜索进程,并检查它的返回码而不是它的输出。

如果你想使用标准输出,你可以使用process.stdout。 它是一个像对象一样的文件。

【讨论】:

  • 我喜欢,但是stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT呢?
  • @tdelaney 当然,如果您不关心输出,可以将其重定向到 /dev/null。这不会改变返回码,上面的代码仍然有效。顺便说一句,os.devnull 可用于获取跨平台文件路径。
  • 感谢您的建议!我会尝试并报告结果!
  • @Fedalto:如果pgrep 生成的输出溢出其标准输出操作系统管道缓冲区(尽管不太可能),您的代码可能会在process.wait() 上死锁。 tdelaney 的DEVNULL 方法避免了它,应该普遍使用。
【解决方案2】:

为什么不使用Popen.poll()?如果它返回None,则该进程尚未终止。如果它返回一个数字,它就是进程的退出代码。

【讨论】:

  • 来自 python 文档“检查子进程是否已终止”。然而 ScriptA 不是 ScriptB 的子进程,这还能用吗?
  • ohboy.. 我想我误解了你,你的意思是在ps aux | grep ScriptA.py 上使用Popen.poll() 对吧?
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2014-08-21
  • 2021-05-29
  • 2011-09-15
  • 2021-12-07
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多