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

Python 使用popen:命令启动服务,但不停止,python,python-2.7,subprocess,popen,Python,Python 2.7,Subprocess,Popen,我试着用python制作一个备份脚本,然后用popen启动、停止一个服务。。。 停止服务是可行的,但不幸的是启动服务是可行的,但会阻止其余的执行,脚本会留在那里,为什么 似乎与httpd服务有某种联系…:-( 程序配置元素类似于“service;httpd;start”或“/etc/init.d/myprog;start” 调用p.communicate()将等待进程终止 参考: 与进程交互:将数据发送到stdin。从stdout和 stderr,直到到达文件结尾。等待进程终止。 可选输入参数应

我试着用python制作一个备份脚本,然后用popen启动、停止一个服务。。。 停止服务是可行的,但不幸的是启动服务是可行的,但会阻止其余的执行,脚本会留在那里,为什么

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

程序配置元素类似于“service;httpd;start”或“/etc/init.d/myprog;start”


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

参考:

与进程交互:将数据发送到stdin。从stdout和 stderr,直到到达文件结尾。等待进程终止。 可选输入参数应该是要发送给子对象的字符串 进程,如果不应向子进程发送数据,则为无


您可以尝试改用。此方法不会等待进程终止。

您还必须将stdin作为管道打开,然后将其关闭(如果您使用read()和write()而不是communicate())

如果它不起作用,并且您实际上不需要任何检查,只需在调用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

别忘了将start改为stop:D:D

我仍然不明白为什么服务myprog stop工作,而服务myprog start不工作?为什么进程没有终止?我缺少启动/停止时调用的实际命令。我猜stop会终止服务并立即返回,因此您没有观察到等待n
p.communicate
在这种情况下。但是,服务启动会调用长时间运行的活动,并且
p.communicate
等待此活动完成。不,这是我的问题“服务xxx启动”这个过程大约需要几秒钟,但p.communicate仍然处于停滞状态…我没有解释为什么我要停止和启动正常的linux服务…启动大约需要30秒,停止大约15秒…但是脚本甚至在10分钟后都没有完成,因为从一段时间以来,所有的东西都已经在运行了…如果我使用ut pipes,我不知道命令是否运行正常,或者是否存在错误是的,我看到了您的尝试。如果确实需要挖掘管道,请不要使用communicate()。请使用p.stdout.read()或p.stderr.read().正如我所说,你无法推断出太多,甚至不会收到任何错误,不管它们是否存在。额外的问题是,服务脚本也会启动服务。因此,调用守护进程的是脚本。有时它可能会混淆问题。照我说的做,它是有效的!抱歉,在通信之前关闭stdin()导致一个IO错误。我忘了。但是停止工作时不关闭任何东西,使用Communication,但是当stdin作为管道打开时。你上次的代码和平与我的代码和平有什么区别?我不确定是否理解?它有stdin=PIPE。正如我在回答的第一行中所写的。这导致了Communication()调用stdin后关闭stdin。这将确保程序终止。如果没有它,似乎出于某种原因,服务脚本会阻塞。这对我有效,在您的情况下有效吗?嗯,当您在命令行中键入
service myprog start
时会发生什么?您是否必须等到键入
service myprog stop
在另一个终端中?不,这非常快,大约5秒。我还想知道为什么只有在命令结束时才会显示stdout…我在运行时没有看到它
if p.poll()==None: print "Still running"
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