Можно ли убить спящую Perl-программу с помощью kill (SIGKILL, $$)? - PullRequest
0 голосов
/ 14 сентября 2011

Я запускаю Perl-программу, в ней есть модуль, который запускается внешним процессом, чтобы убить все дочерние процессы и завершить его выполнение Это отлично работает.

Но, когда определенная функция сообщает, что xyz() выполняется, в условии есть оператор sleep(60).

В данный момент функция выполняется повторно, поскольку она ожидает какого-то значения.

Когда я запускаю процесс уничтожения, как упомянуто выше, процесс не происходит.

Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 14 сентября 2011

Я не понимаю, как вы пытаетесь убить процесс изнутри себя (ваш $$ в теме вопроса), когда он спит.

Если вы убиваете из РАЗНОГО процесса, тогда он будетиметь свой собственный $$.Вам нужно выяснить PID исходного процесса, который нужно убить первым (путем просмотра списка процессов или каким-либо образом связав его с исходным процессом).

Уничтожение спящего процесса работает очень хорошо

$ ( date ; perl5.8 -e 'sleep(100);' ; date ) &

   Wed Sep 14 09:48:29 EDT 2011

$ kill -KILL 8897

   Wed Sep 14 09:48:54 EDT 2011

Это также работает с другими «убивающими» сигналами («INT», «ABRT», «QUIT», «TERM»)


ОБНОВЛЕНИЕ: При повторном чтении может возникнуть проблема, которую вы имели в видубыло то, что "вызванная внешним процессом" часть не происходит.Если это так, вам необходимо:

  • Установить обработчик сигнала CATCHABLE в вашем процессе перед сном ($SIG{'INT'}) - обработчик не может перехватить SIGKILL.

  • Отправить SIGINT из указанного «внешнего процесса»

  • Выполнить всю необходимую очистку после прерывания sleep () с помощью SIGINT из обработчика SIGINT.

...