我已經運行就像一個守護進程Perl程序,Perl的 check.pl &如何在perl程序未運行時自動運行perl程序?
現在,我可以檢查perl程序的運行狀態,但如何修改shell腳本來運行perl程序時,perl程序ISN不跑?
a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'`
for p in $a
do
echo perl
echo $p
done
我已經運行就像一個守護進程Perl程序,Perl的 check.pl &如何在perl程序未運行時自動運行perl程序?
現在,我可以檢查perl程序的運行狀態,但如何修改shell腳本來運行perl程序時,perl程序ISN不跑?
a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'`
for p in $a
do
echo perl
echo $p
done
所以,
這,不是像一個守護進程,但一個簡單的後臺進程。每個進程都有一個父級進程。後臺進程(像上面那樣)將父進程作爲父進程發送到bakcground,因此bash可以終止wait
。 守護進程具有父進程,稱爲init
的進程,其中PID == 1
,因此它被init
監視。
是的,你可以檢查任何其他程序的狀態。一個評論,在節目名稱做這樣grep
coukd有一些奇怪的副作用,比如:
$ perl log.pl &
現在,grepping的ps
的輸出將導致兩種,「日誌」的過程,它們中的哪一個將是syslogd
過程。當然,在你的例子中,你僅限於另一個grep
到perl
,但這是以兩個進程爲代價的。
可以限制兩個進程之一,採用一些更聰明的grep的說法,像
ps -ef | grep 'perl check'
上面會用一個搜索過程中,字符串「perl的檢查」。不幸的是,這會發現grep
過程本身,像
$ 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
一個很好的解決方法是使用刺狀
grep '[p]erl check'
像
$ perl check.pl &
$ ps -ef | grep '[p]erl check'
501 45002 44504 0 11:21 ttys002 0:00.02 perl check.pl
如果grep輸出ps
什麼也沒有返回,你應該啓動腳本。您應該檢查你的a
的內容(你真的應該給它更好的名字爲a
,像perlPID
或此類)。如果-z
參數的長度爲零,則返回「真」,所以:
[[ -z "$a" ]] && perl check.pl &
您可以留下運行檢查,以Perl本身,並通過系統的crontab定時調用它,
use Fcntl ':flock';
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..\n";
# ...
__DATA__
你可以使用一個cronjob,如果你的程序正在運行,檢查每n分鐘,如果沒有重新啓動。 但是,你應該讓一個真正的系統守護進程。 守護::控制是一個Perl模塊,創建這樣一個守護進程有所幫助。可能有其他選擇,但那是我現在使用的一段時間。 你想實現什麼? – davewood 2014-09-01 09:10:37
你有root/admin權限嗎? – AnFi 2014-09-01 09:50:07