我尝试在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)
答案 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()
的调用等待进程终止。
与流程交互:将数据发送到stdin。从stdout和。读取数据 stderr,直到达到文件结尾。 等待进程终止。 可选的输入参数应该是要发送给子级的字符串 如果没有数据应该发送给孩子,则处理或无。
您可以尝试使用p.poll()
。此方法不会等待进程终止。