A função perl kill(0,$pid)
pode ser usada.
Se o código de retorno for 1, o PID existe e você pode enviar um sinal para ele.
Se o código de retorno for 0, então você precisa verificar $ !. Pode ser EPERM (permissão negada), o que significa que o processo existe ou ESRCH, caso em que o processo não existe.
Se o seu código de verificação estiver sendo executado como root
, você poderá simplificar isso apenas para verificar o código de retorno de kill; 0 = > erro, 1 = > ok
Por exemplo:
% perl -d -e 0
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 0
DB<1> print kill(0,500)
0
DB<2> print $!
No such process
DB<3> print kill(0,1)
0
DB<4> print $!
Operation not permitted
DB<5> print kill(0,$$)
1
Isso pode ser feito em uma função simples
use Errno;
sub test_pid($)
{
my ($pid)=@_;
my $not_present=(!kill(0,$pid) && $! == Errno::ESRCH);
return($not_present);
}
print "PID 500 not present\n" if test_pid(500);
print "PID 1 not present\n" if test_pid(1);
print "PID $$ not present\n" if test_pid($$);