2016-02-29 82 views
4

如果某些應用程序在某些遠程計算機上運行,​​我正在嘗試「ping」。ssh + ksh + grep + wc

要做到這一點我有服務器和應用程序文件,如:

server1:application1 
server2:application1 
server3:application2 
Etc. 

我希望獲得的這個名字是在服務器上運行的應用程序數量。

連接並檢查我需要一個SSH連接。

我的腳本是bash和是這樣的:

Ping_Applications() {  
    SetParam 
    cat $APPFILE | while read next 
    do 
    server=`echo $next | cut -d : -f1` 
    app=`echo $next | awk -F":" '{print $2}'` 

    commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'" 
    eval COMA=\$\($commando\) 
    echo $commando 

    if [ $COMA != 0 ] 
    then 
     echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m"; 
    else 
     echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m"; 
    fi 
    done; 
} 

我的問題是,當我送

ssh $server 'ps -fea | grep $app | grep -v grep | wc -l' 

這將返回的數量,但是當通過使用腳本發送,我沒有回答,因爲(我認爲)管道打開一個新的外殼。

我不知道如何解決這個問題。

有什麼想法?

感謝

路易斯

+0

歡迎使用stackoverflow。在突出顯示的代碼/數據/錯誤信息中,使用編輯框左上角的「{}」工具來保持正確的格式。祝你好運! – shellter

+0

是不是有一個原因,你不是直接運行命令,而是將它放入字符串'eval'?此外,不相關,但你可以嘗試使用'pgrep'而不是'ps'和2'grep' –

回答

2

這是Bash FAQ 50

你想把命令在陣列中,而不是使用eval調用它:

commando=(/bin/ssh $server '/bin/ps -fea | /bin/grep "'"$app"'" | /bin/grep -v grep | /bin/wc -l') 
COMA=$("${commando[@]}") 

commando是一個數組有3個元素,所以最後一個元素可以作爲一個單詞傳遞給遠程服務器。注意周圍$app

而且細心的報價,因爲$ COMA將是一個數,使用數字比較:if [ $COMA -ne 0 ]

0

您可能要分開/斌/ ssh命令及其參數。也把 「突擊隊」 在雙引號:

相反的:

commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'" 
eval COMA=\$\($commando\) 

試試這個:

commando="/bin/ps -fea | /bin/grep $app ..." 
/bin/ssh $server "$commando" 

bash的變量被雙引號中擴展,而不是在單引號。

0

感謝您的幫助

我混埃裏克雷諾夫和格倫·傑克曼的答案和解決方案ES這樣的:

Ping_Applications() {  
SetParam 
cat $APPFILE | while read next 
do 
server=`echo $next | cut -d : -f1` 
app=`echo $next | awk -F":" '{print $2}'` 

commando=(/bin/ssh $server '/bin/pgrep -f "'"$app"'" | /bin/wc -l') 
COMA=$("${commando[@]}") 

if [ $COMA -gt 0 ] 
then 
    echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m"; 
else 
    echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m"; 
fi 
done; 

}

現在我有一個不同的問題:

此解決方案的工作原理,但只適用於第一個輸入,然後腳本停止。

我的$ APPFILE中有大約10個不同的應用程序,但只有第一個被執行。

問候。

Luis