簡體   English   中英

在Windows Python中陷阱和處理Taskkill

[英]Trapping and handling taskkill in Windows Python

我正在將pywin32-218用於Windows(Windows XP SP3)上的Python 2.6.6。

在我的Python應用程序中,我有第二個線程(除了主線程),它產生了一個子進程來運行另一個Windows可執行文件。

我的問題是,當主進程(python.exe)被殺死(例如,使用taskkill)時,我想終止子進程(calc.exe)並執行一些清除操作。

我嘗試了各種方法(atexit,signal和win32api.handleConsoleCtrl),但似乎沒有一個方法能夠捕獲taskkill信號。

我的代碼如下(test.py):

import sys
import os
import signal
import win32api
import atexit
import time
import threading
import subprocess

class SecondThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.secondProcess = None
    def run(self):
        secondCommand = ['C:\WINDOWS\system32\calc.exe']
        self.secondProcess = subprocess.Popen(secondCommand)
        print 'calc.exe running'
        self.secondProcess.wait()
        print 'calc.exe stopped'
        # do cleanup here
    def stop(self):
        if self.secondProcess and self.secondProcess.returncode == None:
            self.secondProcess.kill()

secondThread = SecondThread()

def main():
    secondThread.start()

def cleanup():
    print 'cleaning up'
    secondThread.stop()
    print 'cleaned up'

atexit.register(cleanup)

def handleSignal(signalNum, frame):
    print 'handleSignal'
    cleanup()
    sys.exit(0)

for signalNum in (signal.SIGINT, signal.SIGILL, signal.SIGABRT, signal.SIGFPE, signal.SIGSEGV, signal.SIGTERM):
    signal.signal(signalNum, handleSignal)

def handleConsoleCtrl(signalNum):
    print ('handleConsoleCtrl')
    cleanup()

win32api.SetConsoleCtrlHandler(handleConsoleCtrl, True)

main()

該應用程序使用啟動

python.exe test.py

然后,控制台顯示“ calc.exe正在運行”,然后運行Calculator應用程序,並使用Process Explorer,我可以看到calc.exe是python.exe的子進程。

然后我使用殺死了主要過程

taskkill /pid XXXX /f

(其中XXXX是python.exe的PID)

此后發生的情況是命令提示符返回而沒有進一步的輸出(即,沒有打印“ cleaning up”,“ handleSignal”或“ handleConsoleCtrl”),Calculator應用程序繼續運行,並且在Process Explorer中,不再運行python.exe運行中,但calc.exe已重新設置其父級。

Taskkill(通常)發送WM_CLOSE 如果你的應用僅僅是控制台,沒有窗戶,而你可以得到CTRL_CLOSE_EVENT通過由設置處理器SetConsoleCtrlHandler (發生,如果你的控制終端窗口被關閉),你不能接受裸WM_CLOSE消息。

如果您必須堅持使用taskkill(而不是使用其他程序發送Ctrl-C ),則一種解決方案是設置上述處理程序,並確保您的應用程序具有自己的終端窗口(例如,通過使用start.exe "" <yourprog>調用它)。 有關替代方法的詳細信息,請參見https://stackoverflow.com/a/23197789/4513656

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM