【问题标题】:How to kill a process opened with open ()如何杀死用 open() 打开的进程
【发布时间】:2011-06-22 03:12:54
【问题描述】:

我试图杀死我在 Win32 (XP) 上的 Perl 后台打开的进程 我尝试了几件事....似乎没有工作....

$pid = open( CMD, "| cmd.exe > C:\\cmdout.txt" );

要杀死这个后台进程尝试了几件事....:(

  1. system('taskkill /F /IM cmd.exe');

  2. system("taskkill /F /pid $pid");

  3. close CMD || warn "cmd exited $?";

选项 2 从不尝试打印 PID 打印的值与系统中的实际值不同。 选项 1 有效,但我觉得该进程仍在后台运行,因为在我结束该进程后,我等待一段时间并重新启动该进程...

请帮忙

-谢谢

【问题讨论】:

  • 这听起来像是一个特定于 Windows 的问题。
  • 原帖说system('taskkill /F /pid $pid')。我将其更改为双引号,因为否则 $pid 不会被插值。我希望这只是您帖子中的错字,而不是实际代码。

标签: windows perl


【解决方案1】:

我玩过你的案子。显然,两个 cmd.exe 已启动,父级的 PID 由open 返回,其子级执行命令。

第二种情况部分有效,它杀死了父母,但孩子仍在运行。使用/T 选项到taskkill 你可以强制它杀死所有孩子:

system("taskkill /F /T /pid $pid");

您将看到有关终止两个进程的消息:

SUCCESS: The process with PID 3956 child of PID 1864 has been terminated.
SUCCESS: The process with PID 1864 child of PID 580 has been terminated.

第三种情况对我来说似乎很好。关闭文件句柄会使两个 CMD 进程都死掉。

【讨论】:

  • 啊我完全忘记了 /T 选项。谢谢你:)
【解决方案2】:

我建议您移植到使用Win32::Process 并使用它的进程管理支持。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2012-07-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多