Как убить процесс, открытый с помощью open () - PullRequest
1 голос
/ 06 февраля 2011

Я пытаюсь убить процесс, который я открыл в фоновом режиме в Perl на Win32 (XP) Я пробовал несколько вещей .... не похоже, работает ....

$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 работает, но я чувствую, что процесс все еще работает на заднем плане, потому что после завершения процесса я подожду некоторое время и перезапущу процесс ...

Пожалуйста, помогите

-Спасибо

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Я немного поиграл с твоим делом. Очевидно, запущены два 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.

2 голосов
/ 06 февраля 2011

Я рекомендую вам использовать Win32::Process и использовать его поддержку управления процессами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...