2014-09-01 69 views
0

我已經運行就像一個守護進程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 
+0

你可以使用一個cronjob,如果你的程序正在運行,檢查每n分鐘,如果沒有重新啓動。 但是,你應該讓一個真正的系統守護進程。 守護::控制是一個Perl模塊,創建這樣一個守護進程有所幫助。可能有其他選擇,但那是我現在使用的一段時間。 你想實現什麼? – davewood 2014-09-01 09:10:37

+0

你有root/admin權限嗎? – AnFi 2014-09-01 09:50:07

回答

1

所以,

  • 我已經運行一個Perl程序就像一個守護進程, perl check.pl &

這,不是像一個守護進程,但一個簡單的後臺進程。每個進程都有一個父級進程。後臺進程(像上面那樣)將父進程作爲父進程發送到bakcground,因此bash可以終止wait守護進程具有父進程,稱爲init的進程,其中PID == 1,因此它被init監視。

  • 現在,我可以檢查perl程序的運行狀態,

是的,你可以檢查任何其他程序的狀態。一個評論,在節目名稱做這樣grep coukd有一些奇怪的副作用,比如:

$ perl log.pl & 

現在,grepping的ps的輸出將導致兩種,「日誌」的過程,它們中的哪一個將是syslogd過程。當然,在你的例子中,你僅限於另一個grepperl,但這是以兩個進程爲代價的。

可以限制兩個進程之一,採用一些更聰明的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 
  • 但如何修改外殼在perl程序沒有運行時運行perl程序的腳本?

如果grep輸出ps什麼也沒有返回,你應該啓動腳本。您應該檢查你的a的內容(你真的應該給它更好的名字爲a,像perlPID或此類)。如果-z參數的長度爲零,則返回「真」,所以:

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

您可以留下運行檢查,以Perl本身,並通過系統的crontab定時調用它,

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

# ... 


__DATA__