【发布时间】:2015-12-17 18:04:20
【问题描述】:
我有一个使用命令行启动 Ruby on Rails 服务器的自动化工具:
from subprocess import Popen
devnull = open(os.devnull, 'r+')
self.webserver = Popen(server_cmd, shell=True, stdin=devnull, stdout=devnull,
stderr=devnull, close_fds=True, preexec_fn=os.setsid)
网络服务器是一个包含作为单独进程运行的服务器的进程(它应该是这样的)。所以我有stop_webserver 方法来杀死进程并停止Rails 服务器:
def stop_webserver(self):
"""
Stop the Rails server, if there is one running or it was created.
Kill the process and all of its children, in order to avoid having a
zoombie processes.
"""
if self.webserver is None:
self.log.info("Server isn't running. Nothing to do.")
return
if self.is_server_running():
# os.killpg(self.webserver.pid, signal.SIGTERM)
self.log.info("PID: %s" % self.webserver.pid)
# self.log.info("PID: %s" % os.getpgid(self.webserver.pid))
time.sleep(10)
os.killpg(self.webserver.pid, signal.SIGKILL)
self.webserver = None
self.log.info("Server was stopped.")
但是我总是收到以下错误:
Traceback (most recent call last):
File "unit/front_end_test.py", line 27, in runTest
frontend.stop_webserver()
File "front_end.py", line 184, in stop_webserver
os.killpg(self.webserver.pid, signal.SIGKILL)
OSError: [Errno 1] Operation not permitted
如果我尝试使用 os.getpgid 终止进程,我会收到不同的错误:
Traceback (most recent call last):
File "unit/front_end_test.py", line 27, in runTest
frontend.stop_webserver()
File "front_end.py", line 182, in stop_webserver
self.log.info("PID: %s" % os.getpgid(self.webserver.pid))
OSError: [Errno 3] No such process
但是,服务器仍在端口 3001 上运行。该进程从未被终止。如何正确终止进程?
【问题讨论】:
标签: ruby process operating-system multiprocessing signals