OSError: [Errno 1] Operation not permitted - Python

OSError: [Errno 1] Operation not permitted - Python

我有一个自动化工具,可以使用命令行在 Rails 服务器上启动 Ruby:

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。该进程从未被终止。如何正确终止进程?

我通过强制 os.system() kill:

解决了这个问题
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():
        try:
            # os.killpg(self.webserver.pid, signal.SIGKILL)
            os.killpg(self.webserver.pid, signal.SIGTERM)
            self.webserver = None
            self.log.info("Server was stopped.")
        except OSError, e:
            self.log.exception(e)
            self.log.info("PID: %s" % self.webserver.pid)
            os.system("sudo kill %s" % (self.webserver.pid, ))