Вы должны расширить сообщение об ошибке на $ !:
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, что не рекомендуется).
Другой процесс работает с тем же идентификатором пользователя? Только root может отправлять сигналы другому процессу пользователя. – Barmar
Попробуйте включить в сообщение об ошибке '$!', Поэтому вы видите причину ошибки. – Barmar
@Barmar Как проверить идентификатор пользователя скрипта cgi perl. и другой процесс. – RootPhoenix