【问题标题】:OSError: [Errno 1] Operation not permitted - PythonOSError:[Errno 1] 不允许操作 - Python
【发布时间】: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


    【解决方案1】:

    我通过强制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, ))
    

    【讨论】:

      猜你喜欢
      • 2018-04-25
      • 1970-01-01
      • 2022-01-15
      • 2012-06-11
      • 1970-01-01
      • 2017-12-06
      • 2021-02-18
      • 2020-03-26
      • 2017-11-30
      相关资源
      最近更新 更多