2012-06-30 12 views

Antwort

7

Senden Sie ein 0 (Null) -Signal an die Prozess-ID, die Sie mit der Kill-Funktion überprüfen möchten. Wenn der Prozess existiert, gibt die Funktion true zurück, andernfalls gibt sie false zurück.

Beispiel:

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

Sie können ein beliebiges Programm aufrufen, wie Sie von der Kommandozeile würde ein Systemaufruf. Dies ist nur nützlich, wenn Sie die Ausgabe des Programms nicht erfassen müssen.

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

Oder wenn Sie nicht wollen, um die Schale beinhalten:

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

ok, aber wie überprüft man, ob der Prozess mit seinem Namen läuft? : D – Luke

+1

http://search.cpan.org/~durist/Proc-ProcessTable-0.39/ProcessTable.pm Ich habe nicht viel wissen wie mit Perl, aber das bin ich sicher, was Sie suchen. – Sturm

+3

Siehe auch http://stackoverflow.com/questions/3844168/how-can-i-check-if-a-unix-process-is-running-in-perl – Bruce

4

Ähnlich wie eine andere Antwort, aber Sie müssen sicherstellen, und verwenden „grep -v grep“ nicht den grep übereinstimmen sich selbst anrufen. Dadurch stellen Sie sicher, dass Sie nicht auf "True" setzen, wenn Sie nicht möchten.

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

Diese Antwort funktioniert nur auf * nix. Einer der Hauptpunkte der Verwendung von integrierten Befehlen und CPAN-Modulen besteht in den meisten Fällen nicht in der Notwendigkeit der Portabilität. Die Option 'kill 0, $ pid' funktioniert auf anderen Betriebssystemen wie Windows. :-) –

+0

Ich denke du kannst einfach 'pgrep' verwenden, grepping laufender Prozesse ist so üblich, es gibt einen speziellen Befehl dafür;) –

0

Wir verwenden diese, wenn ein Daemon überprüfen läuft basierend auf dem Inhalt des Dämons pid-Datei unter Linux starten:

#!/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

I "töten 0 ..." Ding versucht, aber das wird nicht funktionieren, wenn Sie keine Berechtigung für den Prozess haben, da "Kill 0" nur prüft, ob möglich ist, ein Signal zu senden. Da Sie keine Berechtigung dazu haben (Ihre UID ist nicht 0 und der Prozess ist auch keine UID), werden Sie immer falsch erhalten.

Ich habe auch versucht, auf das Konto/proc/in Linux, nur um zu überprüfen, ob das PID-Verzeichnis vorhanden ist, aber dieser Teil ist nicht sehr portabel: gut für Linux, aber wird nicht wirklich woanders in UNIX ohne eine funktionieren zusätzliche Liebe.

Also schrieb ich diese Unter, 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; 
} 

Die Verwendung ist einfach und ziemlich nützlich, da sie gibt Ihnen auch Besitzer des Prozesses:

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

Viel Spaß! :)

1

Wenn $pid leer ist, wird der Prozess läuft nicht:

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