在命令提示符窗口中,我有一個正在運行的進程。在該過程仍在執行的過程中,我在命令提示符窗口的角落單擊(紅色)'X'。命令提示符窗口關閉,正在運行的進程終止。捕獲Windows終端關閉正在運行的進程
在Linux上,關閉正在運行的進程的父終端將發送該進程SIGHUP
。我如何在Windows上捕獲此事件?
在命令提示符窗口中,我有一個正在運行的進程。在該過程仍在執行的過程中,我在命令提示符窗口的角落單擊(紅色)'X'。命令提示符窗口關閉,正在運行的進程終止。捕獲Windows終端關閉正在運行的進程
在Linux上,關閉正在運行的進程的父終端將發送該進程SIGHUP
。我如何在Windows上捕獲此事件?
SIGHUP的等價物是通過您在SetConsoleCtrlHandler註冊的回叫提供的。您的回調函數將在dwCtrlType = CTRL_CLOSE_EVENT的任意線程池線程上調用。你有5秒鐘的清理時間,你不能取消關閉。
示例代碼是this MSDN article
這不能直接從命令提示符下完成。您將需要一個輔助任何東西(vbs,powershell或自定義MyApp.exe)來捕獲cmd.exe關閉時作出相應的反應。
例如,一個VBS WMI監視器。
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!" & "\\" & strComputer & "\root\cimv2")
Set objEventSource = objSWbemServices.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'cmd.exe'")
Set objEventObject = objEventSource.NextEvent()
Wscript.Echo "CMD.exe closed"
「SIGHUP」 可......在Windows 8.1測試親+ Node.js的0.10.24工作正常..
process.on('SIGHUP', function(){
//Your code goes here.
});
雖然我寧願更專注激光監視器來跟蹤cmd.exe的確切PID,以便我們不會意外觸發不同的cmd.exe實例。你仍然有這個想法。 –
此外,這不會確定是否Red X或批處理是否完成,在批處理結束之前需要將其他邏輯添加到批處理腳本的末尾以取消WMI監視器,以便在正常完成時不觸發。 –
從實際編程語言中,您可以在控制檯關閉事件中使用控制檯控制處理程序和陷阱。 –