如何杀死另一个函数由子进程创建的进程?
How to kill a process created by subprocess by another function?
我想知道为什么我无法通过使用另一个函数来终止从一个函数生成的批处理文件。
我想做的是通过 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.')
怎么杀掉它?
我正在通过新的 cmd.exe
流程调用批处理。在某些情况下,感觉批处理中的命令是 运行 in the 'background':
import subprocess
test_proc = subprocess.Popen(['cmd', '/c', 'C:/temp/myBatch.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE)
test_pid = test_proc.pid
现在您在新的 CMD 进程中隔离了批处理 运行,可以通过 Popen 使用 taskkill /F /PID 1234
轻松终止。
注意:您可能需要提供 cmd.exe, taskkill.exe and your batch
的完整路径,具体取决于 'main script' 的启动方式。
我想知道为什么我无法通过使用另一个函数来终止从一个函数生成的批处理文件。
我想做的是通过 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.')
怎么杀掉它?
我正在通过新的 cmd.exe
流程调用批处理。在某些情况下,感觉批处理中的命令是 运行 in the 'background':
import subprocess
test_proc = subprocess.Popen(['cmd', '/c', 'C:/temp/myBatch.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE)
test_pid = test_proc.pid
现在您在新的 CMD 进程中隔离了批处理 运行,可以通过 Popen 使用 taskkill /F /PID 1234
轻松终止。
注意:您可能需要提供 cmd.exe, taskkill.exe and your batch
的完整路径,具体取决于 'main script' 的启动方式。