2016-04-23 3 views
1

Мне нужно отправить сигнал sigusr2 номер 12 в процесс с именем xyz в скрипте cgi perl. Я делаю следующее:Не удается отправить сигнал другому процессу в perl

my $pid = `pidof xyz`; 

kill 12, $pid or die "could not kill: $pid"; 

Он умирает, когда я нажимаю кнопку, на которой запускается эта команда.

Как отправить сигнал процессу с именем «xyz» в скрипте cgi perl.

+0

Другой процесс работает с тем же идентификатором пользователя? Только root может отправлять сигналы другому процессу пользователя. – Barmar

+0

Попробуйте включить в сообщение об ошибке '$!', Поэтому вы видите причину ошибки. – Barmar

+0

@Barmar Как проверить идентификатор пользователя скрипта cgi perl. и другой процесс. – RootPhoenix

ответ

3

Вы должны расширить сообщение об ошибке на $ !:

my $pid = `pidof xyz`; 
kill 12, $pid or die "could not kill $pid: $!"; 

$! содержит последнюю ошибку системного вызова: http://perldoc.perl.org/perlvar.html#%24ERRNO

Вы должны также проверить, если PID было найдено:

my $pid = `pidof xyz`; 
die 'No PID found for xyz!' unless $pid; 
kill 12, $pid or die "could not kill $pid: $!"; 

UID несоответствие (как указано в комментариях к посту) может быть причиной. Вы можете использовать пс проверить:

my $pid = `pidof xyz`; 
die 'No PID found for xyz!' unless $pid; 
system "ps u $$ $pid"; 
kill 12, $pid or die "could not kill $pid: $!"; 

Выходной сигнал должен выглядеть следующим образом:

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root   1 0.0 0.0 185388 5960 ?  Ss 08:31 0:01 /sbin/init splash 
some  3159 0.0 0.0 27296 8836 pts/11 Ss 08:33 0:00 bash 

Значение USER столбца должен быть одинаковым для обоих процессов (процесс Perl и процесс будет убит), в противном случае вам не разрешено отправлять какой-либо сигнал (кроме случаев, когда ваш скрипт работает от имени root, что не рекомендуется).

Смежные вопросы