Как я могу аккуратно убить процесс в ActiveState Perl?
Нужно ли использовать определенный код выхода?
Win32::Process::Create(
$ProcessObj,
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
"firefox -no-remote -P $prof_name",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
$ProcessObj->kill(0);
Таким образом, это убивает, но не мягко, оно порождает проблемы с профилем Firefox.
2 ответа
Короткие Обычные методы кроме Window's taskkill
силовые. Спасибо mob и melpomene.
Win32::Process
документация не говорит о том, что методы Kill
или же KillProcess
да, но они кажутся довольно тупыми по этому поводу. Windows действительно предоставляет градацию того, как завершить процесс, см., Например, этот пост о корректном завершении через winapi, даже если он не имеет сигналов UNIX. Тем не менее, это, очевидно, не используется ни модулем, ни kill
(см. конец).
Собственный Windows taskkill
следует попросить прекратить процесс. Запросите флаги, запустив taskkill /?
в консоли в вашей системе. Вот документация для taskkill on MS technet
, Например, это завершает процесс его $pid
вместе со своими детьми
my $pid = $ProcessObj->GetProcessID();
system("taskkill /t /pid $pid");
Если метод GetProcessID()
не возвращает реальный идентификатор, см. ссылку ниже для других способов.
Я не могу проверить на Windows сейчас. Там немного больше связанных деталей this post
, вторая часть.
в Perl kill
по-видимому силен на Windows. От perlport
...
kill($sig, $pid)
завершает процесс, определенный$pid
и немедленно завершает работу со статусом выхода$sig
,
Спасибо melpomene за комментарий и документацию по ссылке.
exitcode
Полагаю, только говорит процессу, что сообщать системе как о своем выходе.
Насколько я знаю в Perl, вы могли бы просто сделать
kill -15 (pid)
Кто аккуратно убивает процесс в perl