我正尝试以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))
此代码似乎无法杀死我的子进程,但是当我在另一个python实例中启动os.system("sudo kill <pid>")
时,它确实起作用。
答案 0 :(得分:0)
您的代码中的问题是,它不会关闭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.
答案 1 :(得分:0)
您也可以尝试这个。在这里,我试图为会话组设置会话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()