繁体   English   中英

Python如何杀死根子进程

[英]Python how to kill root subprocess

我正在尝试使用root特权启动进程,并稍后将其杀死。

但是由于某种原因,我无法使其正常工作。

这是一个重现我的问题的小脚本(免责声明:代码有点脏,仅用于错误重现)

import os
import time
import subprocess

command = ["sudo", "sleep", "25"]

process = subprocess.Popen(command,
                           bufsize=1,
                           stdin=open(os.devnull),
                           stderr=subprocess.PIPE,
                           stdout=subprocess.PIPE)

def kill():
    pid = process.pid
    cmd = "sudo kill %s" % pid
    print(cmd)
    print(os.system(cmd))

time.sleep(2)
kill()

stdout, stderr = process.communicate()
print("stdout: " + stdout)
print("stderr: " + stderr)
ret = process.wait()
print("ret: " + str(ret))

这段代码似乎无法杀死我的子os.system("sudo kill <pid>") ,但是当我在另一个python实例中启动os.system("sudo kill <pid>")时,它确实可以工作。

您的代码中的问题是,它不会关闭kill函数中的线程

函数kill会杀死您的子进程命令。 但是它没有结束线程。

注意:如果要强制完全终止该进程,请使用-9。

解决您的问题的方法是。 kill函数中使用process.wait()(这将关闭线程)。

def kill():
    pid = process.pid
    cmd = "sudo kill -9 %s" % pid . # -9 to kill force fully
    print(cmd)
    print(os.system(cmd))
    print(process.wait()) # this will print -9 if killed force fully, else -15.

您也可以尝试这个。 在这里,我试图为会话组设置会话ID,该进程组可能在子进程调用期间创建,并且当您想杀死时,将信号发送给进程组负责人,并将其传输到该进程的所有子进程组。

import signal
process = subprocess.Popen(command,
                       stderr=subprocess.PIPE,
                       stdout=subprocess.PIPE,
                       preexec_fn=os.setsid)   # add session id to group

print(process.pid)

def kill():
    pid = process.pid
    cmd = "sudo kill %s" % pid
    print(cmd)
    os.killpg(os.getpgid(process.pid), signal.SIGTERM)  # send signal to the group

time.sleep(2)
kill()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM