如何在分离模式下杀死进程

Posted

技术标签:

【中文标题】如何在分离模式下杀死进程【英文标题】:How to kill a process in detached mode 【发布时间】:2020-02-05 14:30:14 【问题描述】:

我使用 PyQt5 在 Python 3.8 中开发应用程序。

我需要运行并能够从 PyQT 表单中终止一个单独的进程。 当我使用 process.start 然后 process.kill 它会杀死进程。

但是当我使用process.startDetached() 时,process.kill() 不起作用。

下面是一个例子:

from form import Ui_MainWindow
from PyQt5 import QtWidgets

class myapp(QtWidgets.QMainWindow):

    def __init__(self):
        super(myapp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.process = QProcess(self)
        self.ui.pushButton.clicked.connect(self.btnClicked)
        self.ui.pushButton_2.clicked.connect(self.process.kill)

    def btnClicked(self):
        runstr = 'ping'
        args = ['localhost','-t']
        self.process.startDetached(runstr, args)

app = QtWidgets.QApplication([])
application = myapp()
application.show()
sys.exit(app.exec())

您能否建议如何在分离模式下终止进程。

【问题讨论】:

请在示例中添加 import sys 并使用来自 github.com/VovaBobyr/PythonLearning/blob/master/BackgroundRun/… 的示例中的类 Ui_MainWindow 【参考方案1】:

当您启动分离的进程时,QProcess 无法杀死该进程,因此在这些情况下,您必须获取子进程的 pid 并使用操作系统方法将其杀死,如以下问题的答案所示:

How to terminate process from Python using pid? Is it possible to kill a process on Windows from within Python?
from PyQt5 import QtCore, QtWidgets

import psutil

from form import Ui_MainWindow


class MyApp(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.process = QtCore.QProcess(self)
        self.ui.pushButton.clicked.connect(self.start_process)
        self.ui.pushButton_2.clicked.connect(self.stop_process)
        self._pid = -1

    @QtCore.pyqtSlot()
    def start_process(self):
        runstr = "ping"
        args = ["localhost", "-t"]
        self.process.setProgram(runstr)
        self.process.setArguments(args)
        ok, pid = self.process.startDetached()
        if ok:
            self._pid = pid

    @QtCore.pyqtSlot()
    def stop_process(self):
        if self._pid > 0:
            p = psutil.Process(self._pid)
            p.terminate()
            self._pid = -1


if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)
    application = MyApp()
    application.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于如何在分离模式下杀死进程的主要内容,如果未能解决你的问题,请参考以下文章

linux下 用啥命令查看进程?如何杀死进程?

linux下如何杀死某进程,然后在手动启动

如何杀死oracle死锁进程

linux杀死进程怎么一下子全部杀死

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

winddows下如何查看进程端口占用杀死进程教程