2012-06-30 24 views

Respuesta

7

Envía una señal de 0 (cero) a la identificación del proceso que deseas verificar con la función de cancelación. Si el proceso existe, la función devuelve verdadero; de lo contrario, devuelve falso.

Ejemplo:

#-- check if process 1525 is running 
$exists = kill 0, 1525; 
print "Process is running\n" if ($exists); 

Puede llamar a cualquier programa como lo haría desde la línea de comandos mediante una llamada al sistema. Esto solo es útil si no necesita capturar la salida del programa.

#!/usr/bin/perl 
use strict; 
use warnings; 
my $status = system("vi fred.txt"); 

O si usted no quiere involucrar a la shell:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $status = system("vi", "fred.txt"); 
+1

bien, pero ¿cómo comprobar si el proceso se está ejecutando por su nombre? : D – Luke

+1

http://search.cpan.org/~durist/Proc-ProcessTable-0.39/ProcessTable.pm No tengo mucho que saber con Perl, pero estoy seguro de que es lo que está buscando. – Sturm

+3

Vea también http://stackoverflow.com/questions/3844168/how-can-i-check-if-a-unix-process-is-running-in-perl – Bruce

4

Al igual que en otra respuesta, pero hay que asegurarse de usar y "grep -v grep" para no coincidir con el grep llamarse a sí mismo. Esto asegurará que no estés evaluando en verdadero cuando no quieras.

use strict; 
use warnings; 

my($cmd, $process_name) = ("command here", "process name here"); 

if(`ps -aef | grep -v grep $process_name`) { 
    print "Process is running!\n"; 
}#if 
else { 
    `$cmd &`; 
}#else 
+0

Esta respuesta solo funciona en * nix. Uno de los puntos principales del uso de comandos incorporados y módulos CPAN es que en la mayoría de los casos no tiene que preocuparse por la portabilidad. La opción 'kill 0, $ pid' funciona en otros sistemas operativos, como Windows. :-) –

+0

Creo que puedes usar 'pgrep', la ejecución de procesos en ejecución es tan común, hay un comando especial para eso;) –

0

Usamos esto para comprobar si un demonio está en ejecución, basado en el contenido del demonio comiencen pid-file en Linux:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use feature qw/ say /; 

# vars we report 
my (
    $token,   # optional arg - check against cmd_line if specified 
    $pid_file,  # daemon pid-file, e.g. /var/run/mysqld/mysqld.pid 
    $pid,   # the pid to investigate... 
    $pid_running, # found a pid and it is running 
    $cmd_line,  # cmd_line of the running pid 
    $result,  # 0-OK, 1=FAIL, exit value 
    $error,   # error message if necessary 
); 

# working vars 
my ($fh, $cmd_file); 

die "Daemon pid-file required" unless scalar @ARGV >= 1; 
($pid_file, $token) = @ARGV; 

if (-s $pid_file) { 
    open($fh, "<", $pid_file) or die "open $pid_file: $!"; 
    ($pid) = <$fh>; chomp $pid; close $fh; 

    $pid_running = kill 0, $pid; 

    if ($pid_running) { 
    $cmd_file = "/proc/$pid/cmdline"; 
    local($/) = "\0"; # C-String NULL terminated 
    open($fh, "<", $cmd_file) or die "open $cmd_file: $!"; 
    ($cmd_line) = <$fh>; close $fh; 
    if ($cmd_line && $token && $cmd_line !~ m/$token/) { 
     $error = "token not found: $token in $cmd_line"; 
    } 
    } 
    else { 
    $error = "process not found: $pid"; 
    } 
} 
else { 
    $error = "file not found: $pid_file"; 
} 

# if TOKEN - OK running process with matching cmdline 
$result = $token ? ($pid_running && $cmd_line && $cmd_line =~ m/$token/) 
       : ($pid_running || 0); 

say "token:  ", $token if $token; 
say "file:  ", $pid_file; 
if ($pid) { 
    say "pid:  ", $pid; 
    say "running: ", $pid_running; 
    say "cmdline: ", $cmd_line if $cmd_line; 
} 
say "error:  ", $error if $error; 
say "exit:  ", $result ? 'ok' : 'fail'; 

exit $result; 
3

Probé "matar a 0 ..." cosa, pero eso no funcionará si no tiene un permiso para el proceso, ya que "matar 0" solo comprueba si es posible para enviar una señal. Como no tiene permiso (su UID no es 0 y el proceso tampoco es UID), siempre será falso.

También traté de llevarlo a la cuenta/proc/en Linux para comprobar si el directorio PID está allí, pero esa parte no es muy portátil: bueno para Linux, pero realmente no funcionará en ningún otro lado en UNIX sin una amor adicional

Así que escribió este sub, HTH:

sub is_running() { 
    my $pid = shift; 
    my @proc_data = split(/\s+:\s+/, 
          `ps uax | awk '{print \$1,":",\$2}' | grep $pid`); 
    return (@proc_data && $proc_data[1] == $pid) ? $proc_data[0] : undef; 
} 

uso es simple y muy útil, ya que le devuelve también propietario del proceso:

my $pid = 12345; 
my $owner = &is_running($pid); 
if ($owner) { 
    print "Process with PID $pid is running and owned by \"$owner\".\n"; 
} 

divertirse! :)

1

Si $pid está vacía, el proceso no se está ejecutando:

my $pid = `ps -C $progname -o pid=`; # non-windows solution, sorry 
Cuestiones relacionadas