如何杀死另一个功能的子进程创建的进程?

时间:2019-01-27 14:13:06

标签: python subprocess terminate

我想知道为什么我不能通过使用另一个函数来终止从一个函数引发的批处理文件。

我想做的是通过Telebot在我的专用计算机上管理批处理文件。

我的test.bat文件:

title test.bat
timeout /t 999

我编写了一个单独的模块,该模块具有启动和终止此批处理文件的功能:

from os import path, kill
import subprocess
import signal


TEST_PATH = 'C:\\Users\\Administrator\\Desktop\\TEST\\'
un_proc = None 


class sidim(object):
    def __init__(self):
        pass

    def launch_test(self):
        test_proc = subprocess.Popen([path.join(TEST_PATH,
                                                'TEST.bat')],                                                                              
                          creationflags=subprocess.CREATE_NEW_CONSOLE)
        self.test_pid = test_proc.pid

    def kill_test(self):
        kill(self.test_pid, signal.SIGTERM)

当我使用/start_test命令启动批处理文件时,它工作正常,并且批处理文件正在正确启动:

import telebot 
import sidimanager

bot = telebot.TeleBot('TOKEN')
sidim = sidimanager.sidim()


@bot.message_handler(commands=['start_test'])
def handle_start_test(message):
    sidim.launch_test()
    bot.reply_to(message, 'Test .bat file has been successfuly launched.')

但是当我尝试使用/kill_test命令终止该批处理时,该批处理文件将忽略该文件并继续工作:

@bot.message_handler(commands='kill_test')
def handle_kill_test(message):
    sidim.kill_test()
    bot.reply_to(message, 'Test .bat file has been successfuly killed.')

我怎么杀死它?

1 个答案:

答案 0 :(得分:0)

我正在通过新的<div id = "NameXYZ"> <script src = "// 123.com"> </ script> <script src = "// 1234.com"> </ script> </div> 流程致电该批次。在某些情况下,感觉该批处理中的命令在“后台”中运行:

cmd.exe

现在,您正在以新的CMD流程隔离批处理运行,可以使用import subprocess test_proc = subprocess.Popen(['cmd', '/c', 'C:/temp/myBatch.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE) test_pid = test_proc.pid 通过Popen轻松终止该批处理。

注意:您可能需要提供taskkill /F /PID 1234的完整路径,具体取决于“主脚本”的启动方式。