2013-11-23 82 views
3

我有一個java jar程序,我試圖在我的機器啓動時運行。理想情況下,shell腳本會每60秒檢查一次以確保jar正在運行。如何檢查jar是否在centos上運行,這看起來沒有工作?檢查是否有shell從殼運行

我現在的sh文件:

#!/bin/bash 

while [ true ] 
do 
    cnt=`ps -eaflc --sort stime | grep /home/Portal.jar |grep -v grep | wc -l` 
    if(test $cnt -eq 3); 
    then 
     echo "Service already running..." 
    else 
     echo "Starting Service" 
     java -jar /home/Portal.jar >> /dev/null & 
    fi 
    sleep 1m 
done 

我用this迄今引用。

+1

你是什麼意思,它似乎沒有工作?究竟是什麼問題? –

+0

它總是去啓動服務。它不能檢測,如果程序已經運行 – Sixthpoint

回答

3

根據你的程序在做什麼,可能會有更多或更少智能的方式進行檢查。例如,如果你有一些服務器,它將監聽一個端口。

然後像

netstat -an | fgrep tcp | fgrep LISTEN | fgrep :87654 # or whatever your port is 

可以做的工作。

再有就是lsof,這也可能檢測偵聽端口。

最後,你可以連接併發出一個僞請求。例如,對於http服務器,您可以使用lynxcurl。對於具有非標準協議的服務器,您可以編寫一個小型客戶端程序,其唯一目的是連接到服務器以查看它是否在那裏。

-1

爲什麼你認爲$cnt應等於3?如果進程已經運行,它不應該等於1嗎?

+0

當做它想出了運行 – Sixthpoint

+0

麻煩看起來3個工序的p纖ep Java成爲未來來自:測試:-eq:一元運算符預期 – Sixthpoint

+0

但是'p纖ep java'是不是有什麼你的命令實際上是!您正在尋找一個特定的應用程序!我會這樣做'如果[$ cnt -eq 1]'。你需要嘗試一些腳本,直到它們正確工作,而不僅僅是運行你的腳本和祈禱。 –

1

幾個月前,我做了同樣的場景。我的任務是確保一個jar分發的java程序在Linux服務器上全天候運行。 我的程序是基於控制檯的,開始,做了一些事情然後停下來。 我做了一個shell腳本,開始等待結束,然後在無限循環中重新啓動應用程序。 我安裝了runit,創建了一個服務並提供了這個腳本作爲運行腳本。工作得很好。 通常,shell腳本確保java程序正在運行,並且runit確保啓動腳本(這是我們的腳本)正在運行。

您可以找到有價值的信息:http://smarden.org/runit/faq.html

3

Store中的進程id的文件,並檢查了這個過程。

#!/bin/bash 

while [ true ] 
do 
    pid=$(cat /tmp/portal.pid) 
    if [[ -n "$pid" && $(ps -p $pid | wc -l) -eq 2 ]] 
    then 
     echo "Service already running..." 
    else 
     echo "Starting Service" 
     java -jar /home/Portal.jar >> /dev/null & 
     echo $! > /tmp/portal.pid 
    fi 
    sleep 1m 
done 

/tmp將在重新啓動時清零,在這種情況下,所有的權利。

0

而不是將進程睡眠,我寧願把它退出並使用crontab運行過程中,每1分鐘;將檢查其運行,否則只是停止腳本。

#!/bin/sh 
declare -a devId=("/Path/To/TestJar.jar Test1" "/Path/To/TestJar.jar Test2") #jarfile with pathname and Test as argument 
# get length of an array 
arraylength=${#devId[@]} 
# use for loop to read all values and indexes 
for ((i=1; i<${arraylength}+1; i++)); 
do 
y=${devId[$i-1]} 
cnt=`ps -eaflc --sort stime | grep "$y" |grep -v grep | wc -l` 
if [ $cnt = 0 ] 
then 
java -jar $y& > /dev/null 
b=$(basename $y) 
echo $b 
#DO SOME OPERATION LIKE SEND AN EMAIL OR ADD TO LOG FILE 
continue 
elif [ $cnt != 0 ] 
then 
echo 'do nothing' 
fi 
done