从Python控制“类似守护进程”的linux脚本

时间:2014-08-06 10:11:09

标签: python linux

我想:

  • 从Python执行Linux脚本
  • 等待间隔
  • 杀死脚本(来自Python)并获取它的输出(在Python中)

我玩过子进程库,但处理输出的所有函数都是阻塞的(它们等待进程终止)。但是,在我的特定情况下,脚本是非终止的。

有没有办法运行脚本"在后台",一段时间后杀掉它,然后获取它的输出?

2 个答案:

答案 0 :(得分:1)

您应该查看Popen Objects中的subprocess,它们完全适合您要执行的操作:

import subprocess, time, signal

p = subprocess.Popen(['python', '-u', 'myscript.py'], stdout=subprocess.PIPE)
time.sleep(5)
p.send_signal(signal.SIGTERM)
output = p.communicate()[0]

print('Process has exited with code %d' % p.wait())
print('Output is %s' % str(output))

如果发送信号以停止进程,则某些数据可能会在进程输出缓冲区中丢失。这就是为什么您可能希望确保脚本不缓冲其输出(如果您的脚本也是python脚本,请使用上面的“-u”选项)。

答案 1 :(得分:0)

不幸的是,在Click中禁用缓冲不是一个选项(据我所知)。为了解决脚本缓冲输出的问题,我选择了:

编写一个脚本(我称之为finite_script.sh)运行我的程序(script.sh)一段有限的时间(并将stderr重定向到stdout):

#!/bin/bash
$1 2>&1 & 
sleep 5
kill -KILL `pgrep $1`

...并在Python中运行(终止)finite_script.sh脚本:

p = subprocess.Popen(['finite_script.sh', 'script.sh'], stdout=subprocess.PIPE)
(output, err) = p_real.communicate()
print output

解决方案不是很优雅,但它适用于我的特定设置(其中script.sh实际上是一个Click脚本)。

感谢您之前的回答!