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 № 1Damit,
- 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__