以前曾经问过,但我在代码中找不到明确的答案.
我打开一个进程,ProcessA(带有PID 1234).此过程打开子进程ProcessAB(PID 5678).在我完成后,我终止了ProcessA,但我仍然有ProcessAB的挥之不去.
如何终止整个进程树?我的意思是,我如何确保如果我终止我打开的流程,我也会终止所有相关流程?
谢谢
代码表示赞赏.
我想运行任意基于控制台的子流程,并从单个主流程管理它们.基于控制台的子进程通过stdin,stdout和stderr进行通信,如果在真正的控制台中运行它们,则在按CTRL + C时它们会完全终止.其中一些实际上可能是一个进程树,例如运行可执行文件的批处理脚本,该可执行文件又可以运行另一个可执行文件来完成某些工作.我想重定向他们的标准I/O(例如,以便我可以在GUI窗口中显示他们的输出)并且在某些情况下向他们发送CTRL + C事件,以便他们放弃并彻底终止.
以下两个图首先显示了正常结构 - 一个主进程有四个工作子进程,其中一些有自己的子进程; 然后当其中一个工作人员需要被停止时应该发生什么 - 它和它的所有孩子应该得到CTRL + C事件,但没有其他进程应该收到CTRL + C事件.
流程图http://pics.livejournal.com/clockworksaint/pic/0007z5yr/s640x480.png
此外,我更希望用户看不到额外的窗口.
这是我尝试过的(注意我在使用Python,但C的解决方案仍然有用):
CREATE_NEW_CONSOLE,然后让它产生工作进程.然后在我们要杀死worker时调用GenerateConsoleCtrlEvent(CTRL_C_EVENT,0).不幸的是,CREATE_NEW_CONSOLE似乎阻止我重定向标准I/O通道,所以我没有简单的方法将输出返回到主程序.CREATE_NEW_PROCESS_GROUP,然后让它产生工作进程.然后在我们要杀死worker时调用GenerateConsoleCtrlEvent(CTRL_C_EVENT,0).不知何故,此管理对CTRL + C发送只到主过程,这是完全无用的.仔细观察,GenerateConsoleCtrlEvent表示无法将CTRL + C发送到进程组.CREATE_NEW_PROCESS_GROUP.然后调用GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,pid)来杀死worker.这并不理想,因为CTRL + BREAK不如CTRL + C友好,可能会导致终止混乱.(例如,如果它是一个Python进程,则不能捕获KeyboardInterrupt并且不会运行finally块.)有什么好方法可以做我想要的吗?我可以看到理论上我可以在第一次尝试的基础上建立并找到其他方法在进程之间进行通信,但我担心它会变得非常尴尬.是否有其他程序可以达到同样效果的好例子?它似乎很简单,不能满足所有这一要求.
我有一个Java webstart进程,它是Windows批处理脚本的一部分.在这种情况下,我在批处理脚本中使用javaws命令.使用"apache commons exec"以编程方式调用此匹配脚本(start.bat).在某些情况下,javaws调用的java进程会挂起,我必须从批处理脚本start.bat开始终止整个进程线程.有没有通过apache commons exec杀死整个进程树的程序方法?
我尝试过使用"execWatchdog.destroyProcess();" 在"start.bat"脚本上.但是它只会杀死start.bat进程而不是整个进程树.
有没有办法通过apache-commons-exec或类似的代码杀死整个进程树?
我已经看到这个问题在c ++中执行相当于"杀死进程树"的Windows,它在c ++中执行相同的任务.我想知道是否有人通过JNI实现了调用Windows本机系统调用.
谷歌让我失望,我在MSDN上找不到它.man wmi在Windows shell中不起作用...我正在查找可以查询的对象列表,以及如何构造查询.
使用WMI我的意思是用于查询诸如"Win32_Process"之类的东西的查询语言
我知道类和示例查询,但我正在寻找所有可能的查询对象的完整列表.
我已经使用调试器找到了我正在寻找的内容,但是查看完整的概述以了解WMI的可能性仍然很有意思.
在C#中,我们使用以下代码来终止进程树.有时它可以工作,有时它不工作,可能与Windows 7和/或64位有关.
它找到给定进程的子进程的方法是调用GetProcesses以获取系统中的所有进程,然后调用NtQueryInformationProcess以查找父进程为给定进程的每个进程.它以递归方式执行此操作,以便走树.
NtQueryInformationProcess不应该使用在线文档说.相反,有一些东西叫做EnumProcesses,但我找不到C#中的任何例子,只有其他语言.
什么是在C#中杀死进程树的可靠方法?
public static void TerminateProcessTree(Process process)
{
IntPtr processHandle = process.Handle;
uint processId = (uint)process.Id;
// Retrieve all processes on the system
Process[] processes = Process.GetProcesses();
foreach (Process proc in processes)
{
// Get some basic information about the process
PROCESS_BASIC_INFORMATION procInfo = new PROCESS_BASIC_INFORMATION();
try
{
uint bytesWritten;
Win32Api.NtQueryInformationProcess(proc.Handle, 0, ref procInfo,
(uint)Marshal.SizeOf(procInfo), out bytesWritten); // == 0 is OK
// Is it a child process of the …Run Code Online (Sandbox Code Playgroud)