use*_*259 285 python linux subprocess kill-process
我正在使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
但是,当我尝试使用时杀死:
p.terminate()
要么
p.kill()
该命令在后台继续运行,所以我想知道如何实际终止该进程.
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
它在发出时会成功终止p.terminate().
mou*_*uad 391
使用进程组以便能够向组中的所有进程发送信号.为此,您应该将会话ID附加到生成/子进程的父进程,这是您的案例中的shell.这将使其成为流程的组长.现在,当信号发送给进程组负责人时,它会被传输到该组的所有子进程.
这是代码:
import os
import signal
import subprocess
# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 
os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # Send the signal to all the process groups
小智 85
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()
p.kill()最终杀死shell进程并cmd仍在运行.
我找到了一个方便的解决方法:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
这将导致cmd继承shell进程,而不是让shell启动子进程,而不会被杀死.  p.pid那将是你的cmd进程的id.
p.kill() 应该管用.
我不知道这会对你的烟斗产生什么影响.
Jov*_*vik 46
如果你可以使用psutil,那么这是完美的:
import subprocess
import psutil
def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()
proc = subprocess.Popen(["infinite_app", "param"], shell=True)
try:
    proc.wait(timeout=3)
except subprocess.TimeoutExpired:
    kill(proc.pid)
小智 23
我可以用它做
from subprocess import Popen
process = Popen(command, shell=True)
Popen("TASKKILL /F /PID {pid} /T".format(pid=process.pid))
它杀死了cmd.exe我给出命令的程序.
(在Windows上)
当shell=Trueshell是子进程时,命令是它的子进程.所以任何SIGTERM或SIGKILL将杀死shell而不是它的子进程,我不记得一个好的方法来做到这一点.我能想到的最好的方法是使用shell=False,否则当你杀死父shell进程时,它会留下一个已经失效的shell进程.
这些答案都不适合我,所以我离开了有效的代码.在我的情况下,即使在使用.kill()并获得.poll()返回代码的过程中,该过程也没有终止.
以下subprocess.Popen 文件:
"...为了正确清理一个表现良好的应用程序应该杀死子进程并完成通信......"
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
在我的情况下,我错过了proc.communicate()电话后proc.kill().这会清除进程stdin,stdout ......并终止进程.
正如Sai所说,shell是孩子,所以信号被它截获 - 我发现的最好方法是使用shell = False并使用shlex来拆分命令行:
if isinstance(command, unicode):
    cmd = command.encode('utf8')
args = shlex.split(cmd)
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
那么p.kill()和p.terminate()应该如你所愿.
| 归档时间: | 
 | 
| 查看次数: | 263048 次 | 
| 最近记录: |