Ich möchte wissen, wie überprüft werden, ob Programm läuft und dieses Programm ausführen, wenn nicht.Überprüfen Sie, ob das Programm läuft und führen Sie es aus, wenn nicht in Perl
Antwort
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");
ok, aber wie überprüft man, ob der Prozess mit seinem Namen läuft? : D – Luke
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
Siehe auch http://stackoverflow.com/questions/3844168/how-can-i-check-if-a-unix-process-is-running-in-perl – Bruce
Ä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
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. :-) –
Ich denke du kannst einfach 'pgrep' verwenden, grepping laufender Prozesse ist so üblich, es gibt einen speziellen Befehl dafür;) –
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;
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ß! :)
Wenn $pid
leer ist, wird der Prozess läuft nicht:
my $pid = `ps -C $progname -o pid=`; # non-windows solution, sorry
- 1. So führen Sie das Java-Programm in der Eingabeaufforderung aus
- 2. Überprüfen Sie, ob es das Fensterobjekt
- 3. Überprüfen, ob das Programm geöffnet ist. Wenn nicht, öffnen Sie es
- 4. Überprüfen Sie, ob das Verzeichnis existiert in ~/mit Perl
- 5. Überprüfen Sie, ob Remote-Prozess läuft (Linux)
- 6. Überprüfen, ob Prozess läuft, wenn nicht starten
- 7. Überprüfen Sie das Programm debug
- 8. Überprüfen Sie, ob der Dienst läuft.
- 9. Führen Sie Python-Skript nur, wenn es nicht ausgeführt wird
- 10. So führen Sie eine http.request in einem importierten Modul aus. Es ist nicht läuft, wenn ich
- 11. Überprüfen Sie, ob ein gespeicherter Prozess läuft.
- 12. Überprüfen Sie, ob ein Intervall läuft und umgekehrt
- 13. Ubuntu - SmartFoxServer - Überprüfen Programm läuft
- 14. Führen Sie ein JGNAT-Programm aus?
- 15. Überprüfen Sie, ob das Feld numerisch ist, und führen Sie den Vergleich nur für dieses Feld in einer Anweisung aus.
- 16. Um zu überprüfen, ob das Skript alle 5 Minuten läuft
- 17. Führen Sie ssh aus und führen Sie den Befehl aus
- 18. Überprüfen Sie, ob meine App in Android läuft
- 19. Überprüfen, ob das Argument für ein Programm leer ist?
- 20. Überprüfen, ob der Dienst in WiX läuft
- 21. Programm überprüfen, ob das Passwort korrekt ist
- 22. Überprüfen Sie, ob ein PHP-Skript noch läuft
- 23. Führen Sie ein anderes Programm in C++
- 24. Führen Sie Perl-Code direkt in Emacs
- 25. Überprüfen, ob der Prozess läuft
- 26. Überprüfen Sie, ob Shell-Skript über die Leitung läuft
- 27. Wie überprüft man, ob ein Service über Batch-Datei läuft und startet es, wenn es nicht läuft?
- 28. Löschen der Klassendatei, wenn das Programm läuft?
- 29. Führen Sie ein Programm in einem foreach
- 30. Führen Sie das Befehlszeilenprogramm in Java ohne absoluten Pfad aus
Welches Betriebssystem verwenden Sie? –
Debian 6, aber die Frage ist gelöst. – Luke