/ / Wie läuft das Perl-Programm automatisch ab, wenn es nicht läuft - Perl, Schale

Wie starte ich das Perl-Programm automatisch, wenn das Perl-Programm nicht läuft? - Perl, Schale

Ich habe ein Perl-Programm wie einen Deamon ausgeführt, perl check.pl &

Jetzt kann ich den Status des Perl-Programms überprüfen, aber wie kann ich das Shell-Skript so ändern, dass das Perl-Programm ausgeführt wird, wenn das Perl-Programm nicht läuft?

    a=`ps -ef | grep "perl" | grep "check" |awk "{print $2}"`
for p in $a
do
echo perl
echo $p
done

Antworten:

1 für die Antwort № 1

Damit,

  • Ich habe ein Perl-Programm wie ein Deamon ausgeführt, Perl check.pl &

Dies, isn "t wie ein Daemon, aber ein einfacher Hintergrundprozess. Jeder Prozess hat eine Elternteil verarbeiten. Der Hintergrundprozess (wie der obige) hat als übergeordnetes Element die "bash", was es in das bakcground schickt, also kann das bash wait für die Kündigung. Die Daemon hat den übergeordneten Prozess den Prozess aufgerufen init, mit dem PID == 1 und deshalb wird es vom beobachtet init.

  • Jetzt kann ich den Perl-Programmstatus überprüfen,

Ja, da Sie den Status eines anderen Programms überprüfen können. Ein Kommentar dazu grep Auf Programmnamen haben coukd einige seltsame Nebenwirkungen, wie zum Beispiel:

$ perl log.pl &

Nun grepping die Ausgabe des ps führt zu zwei "log" -Prozessen, von denen einer der syslogd verarbeiten. Natürlich haben Sie dies in Ihrem Beispiel auf ein anderes beschränkt grep zu perl Nur, aber auf Kosten zweier Prozesse.

Sie können zwei Prozesse auf einen beschränken, indem Sie ein intelligenteres grep-Argument verwenden, wie z

ps -ef | grep "perl check"

Das obige würde mit einem Prozess suchen, die Zeichenfolge "perl check". Das wird leider das finden grep Prozess selbst, wie

$ perl check.pl &
$ ps -ef | grep "perl check
501 45063 42171   0 11:26   ttys001    0:00.00 grep perl check
501 45002 44504   0 11:21   ttys002    0:00.02 perl check.pl

Eine schöne Problemumgehung ist das Verwenden eines Stiches wie

grep "[p]erl check"

mögen

$ perl check.pl &
$ ps -ef | grep "[p]erl check"
501 45002 44504   0 11:21   ttys002    0:00.02 perl check.pl
  • Aber wie kann man das Shell-Skript so ändern, dass das Perl-Programm ausgeführt wird, wenn das Perl-Programm nicht ausgeführt wird?

Wenn der grepping den out out ps gibt nichts zurück, Sie sollten das Skript starten. Sie sollten den Inhalt Ihres überprüfen a (Sie sollten es wirklich besser nennen als a, mögen perlPID oder so). Wenn die Länge des Arguments von -z Null ist, gibt es "true" zurück, also:

[[ -z "$a" ]] && perl check.pl &

1 für die Antwort № 2

Sie können running check perl selbst überlassen und regelmäßig über das System crontab aufrufen

use Fcntl ":flock";
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..n";

# ...


__DATA__