2014-11-21 65 views
1

我是unix/linux的新手,需要一個shell腳本來啓動一個程序,如果它沒有運行的話。該程序的名稱是「literaail」,它在服務器上有一個位於「/local/publish/mtc_preprint/util/Literail.log」的日誌。這個程序應該打印這個「啓動ftp檢查Get_Job1」。聲明每30秒一次。如果沒有,我需要一個shell腳本來啓動這個過程。目前我做它使用這些命令手動:帶有cron作業的Shell腳本在未運行時啓動程序?

ps -ef | grep ftp_util_mtc_pp.sh 
ps -ef | grep literail (this command lists the jar file related to the literail program) 
kill "parentjobnumber" "childjobnumber" 
./ftp_util_mtc_pp.sh & (this command restarts the process). 

我有一個「ftp_util_mtc_pp.sh」的文件,這個文件中,我有以下命令:

#!/bin/bash 

utildir="/local/publish/mtc_preprint/util" 

cd $utildir 

java -jar LiteRail_3.0.1.jar literail.properties > /dev/null 2>&1 



exit 

有人可以幫助我的shell腳本。謝謝。

+0

已嘗試查找過程編號(如果存在):PROCESS_NUM ='ps -ef | grep「$ 1」| grep -v「literail」| wc -l'如果沒有運行java – Jay 2014-11-21 13:44:50

+0

@MoeEhsani我不知道,literail是什麼,但請記住,其他用戶進程可能會被計算在內。 – 2014-11-21 14:33:37

+0

整個問題在某種程度上被誤導 - 使用shell腳本輪詢流程表本身不是確保流程或服務繼續運行的最佳方式,而是根據問題假定問題。 – 2014-11-21 16:43:10

回答

2

此文件是找到運行LiteRail罐子如果運行它會殺死並重新運行它它不只是運行的罐子,並在指定位置添加日誌。

ftp_util_mtc_pp.sh是:

#!/bin/bash 

PID= ps -ef | grep LiteRail_3 

if [[ -z "$PID" ]]; then 
     #process is running so we kill it 
    Kill -9 PID 
fi 

#running the jar file you 
nohup java -jar /local/publish/mtc_preprint/util/LiteRail_3.0.1.jar literail.properties > /local/publish/mtc_preprint/util/Literail.log 2>&1 & 

希望這一個幫助。

0

有兩種常見的方法可以做到這一點:

您保存您的進程的PID,並將其保存到一個文件中。

#!/bin/bash 

pf='/home/abc/pidfile' 
if kill -0 $(< "$pf"); then # process in pidfile is yours and running 
    exit 0 
else 
    echo "starting process" 
    echo $$ > "$pf" 
    exec ftp_util_mtc_pp.sh 
fi 

另一種方法是使用PS和grep來檢查正在運行的進程:

#!/bin/bash 

if ps -u $UID | grep 'LiteRail_3.0.1.jar' >/dev/null 2>&1; then # process is running 
    exit 0 
else 
    echo "starting process" 
    exec ftp_util_mtc_pp.sh 
fi 

請確保,由ps | grep線正確檢測過程。

如果您p纖ep安裝:

pgrep -fl -U $UID 'LiteRail_3.0.1.jar' 
0

相反的:

ps -ef | grep ftp_util_mtc_pp.sh 

用途:

pgrep ftp_util_mtc_pp.sh 

這將避免你拿起自己grep命令作爲一個過程的問題。您還可以指定一個特定的用戶:

pgrep -u $user ftp_util_mtc_pp.sh 

然而,由於你的shell腳本主要是運行一個jar文件,你應該尋找:

pgrep -u $user -f "LiteRail_.*\.jar" 

-f說要尋找的正則表達式整個命令字符串。

現在我們已經開始了,讓我們來談談crontabs。一個crontab是一個命令,你可以指定你希望它運行的頻率。您將該命令放入您的crontab,它可以每分鐘運行一次。

您可以創建一個腳本來檢查您的java命令是否正在運行,以及是否不重新啓動命令。標準輸出會郵寄給您,因此您可能需要將其重定向到日誌文件或/dev/null

標準操作過程是捕獲要確保運行的進程的進程ID,然後檢查進程ID是否仍然運行。如果不是,請重新啓動作業。您可以在開始工作並將其投入後臺後,通過查看$!環境變量來捕獲進程ID。