在此设置中,任务计划程序有效地监视cmd.exe,并且在使用Process Explorer时,可以观察到子.exe进程停放在cmd.exe进程树下.但是,当任务计划程序由于超出允许的时间限制而导致cmd.exe死亡时,子.exe进程可能不会与其父进程一起被杀死并成为孤立的.这些进程无限期地停滞不前.由于Process Explorer中显示的进程线程状态,我怀疑这些进程最终出错,并弹出一个.NET调试器对话框(这些是.NET应用程序),由于批处理作业用户是一个单独的用户,因此无法看到帐户.
最初,当我在我的Windows XP工作站上调查此行为时,我发现从我的测试.cmd脚本启动的子.exe进程在任务计划程序决定时间到期时会与cmd.exe一起被杀死.我无法孤立子进程.
基于预感,我最终转移到Windows 2003机器上进行测试.同样,子进程像我工作站中那样终止.我的第二步是使用另一个用户帐户来运行计划任务.这一次,cmd.exe在超过时间限制后被杀死,但子进程仍然存在,就像我的客户在其生产服务器中观察到的那样.
如果我抢先登录该批处理用户帐户(恰好是另一个管理员帐户)来声明桌面会话,我的测试.exe程序中的任何错误或信息弹出窗口都将被路由并呈现在该桌面上,这样我就可以看到实际的用户输出.如果我只在调用计划任务后登录,桌面会话将不会“回收”现有进程的窗口;他们永远隐藏起来.
我的问题是,我在这里丢失了什么条件可能导致任务计划程序不能清除cmd.exe下的子进程?使用另一个会导致此行为的帐户有什么特别之处,但在使用我当前的管理员帐户运行计划任务时却没有?
如果您正在运行多个进程(我们经常运行5个或更多“powershell.exe”),请将“命令行”列添加到任务管理器中的“详细信息”选项卡.这应该清楚说明哪个进程ID是您要杀死的进程ID