使用popen启动服务:命令不停止

时间:2015-08-12 13:24:40

标签: python python-2.7 subprocess popen

我尝试在python中创建一个备份脚本并启动,停止使用popen的服务... 停止服务正在运行,但不幸地启动服务工作,但阻止执行的其余部分,脚本停留在那里,为什么?

似乎与httpd服务有某种联系......: - (

程序配置元素就像" service; httpd; start"或者" /etc/init.d/myprog;开始"

class execute(actions):
    def __init__(self,config,section,logger):
        self.name="execute"
        actions.__init__(self,config,section,logger)

    def process(self):
        try:
            program=self.config.get(self.section,"program").split(";")
            self.logger.debug("program=%s" % program)
            p = subprocess.Popen(program, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout, stderr = p.communicate()

            if stdout:
                self.logger.info(stdout)
            if stderr:
                self.logger.error(stderr)

            return p.returncode

        except Exception:
            self.logger.exception(Exception)

2 个答案:

答案 0 :(得分:2)

你必须打开一个stdin作为管道,然后关闭它(如果你使用read()和write()而不是communication())。

p = subprocess.Popen(..., stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdin.close()
print "Stdout:", p.stdout.read()
print "Stderr:", p.stderr.read()

如果它不起作用,并且你真的不需要任何检查,只需在调用Popen后关闭所有管道,这将导致程序执行和分离 来自管道。

警告:如果程序没有自行终止,这将使程序作为守护程序运行。

执行此操作后,您可以调用wait()来查看它是否也会阻止。并使用exitcodes检查最终的错误。

他们并不多。只是服务开始与否。有时即使它返回服务正在运行,但服务崩溃。

要检查服务脚本是否仍在运行,但没有阻止,请使用:

if p.poll()==None: print "Still running"

否则,poll()返回退出代码。

这可以很好地启动和停止服务:

from subprocess import Popen, PIPE
service = "brltty"
p = Popen(["service", service, "start"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
# Note: using sequence uses shell=0
stdout, stderr = p.communicate()
print "Stdout:", stdout
print "Stderr:", stderr

别忘了改变开始停止:D:D:D

答案 1 :(得分:0)

p.communicate()的调用等待进程终止。

请参阅:subprocess documentation

  

与流程交互:将数据发送到stdin。从stdout和。读取数据   stderr,直到达到文件结尾。 等待进程终止。   可选的输入参数应该是要发送给子级的字符串   如果没有数据应该发送给孩子,则处理或无。

您可以尝试使用p.poll()。此方法不会等待进程终止。