2015-04-30 162 views
1

我正在編寫一些代碼,目前依次SSH到幾個服務器並遠程測試以查看進程是否正在運行。最終目標是讓我在進程沒有運行的情況下收到電子郵件提醒。我有那麼多工作。如果聲明,SSH和執行遠程命令

但是,我還希望在SSH連接失敗時發出警告。麻煩的是,無論我嘗試什麼,我都無法使用我當前的if,the,else代碼。

#!/bin/sh 
filename="/root/scripts/sysmon_server_lists.txt" 
identity="/root/.ssh/sysmon" 
OLDIFS=$IFS 
IFS=, 

while read -r server searchtxt; 
do 
     if [ ! -z $server ] 
     then 
       if [ `ssh -n -q -t -i $identity [email protected]$server "ps -ef | grep $searchtxt | grep -v grep | wc -l"` -gt 0 ] 
         then 
           echo "Process is running on $server." 
         else 
           echo "Process is not running on $server." 
         fi 

       echo "Server is $server" 
       echo "Searchtext is $searchtxt" 
       echo " " 
       echo "-----" 
       echo " " 
     fi 
     done < $filename 

IFS=$OLDIFS 
echo "Finished" 

exit 0 
+0

不要在本地測試'ssh'的輸出。在遠程端進行測試,並根據需要以成功或錯誤狀態退出。然後使用該錯誤狀態作爲你的指示器(這也讓你指示ssh失敗)。 –

回答

0

檢查進程是否正在運行的一個簡單方法是使用pkill -0。您可以直接在if聲明中檢查其返回值,以免除括號[ ]和反引號`...`的需要。

if ssh -nqti "$identity" [email protected]"$server" pkill -0f "$searchtxt"; then 
    echo "Process is running on $server." 
else 
    echo "Process is not running on $server." >&2 
fi 

如果任一sshpkill命令失敗,這將方便地失敗。

您可以做出的另一個改進是僅在read命令期間覆蓋$IFS。這會讓你擺脫代碼來保存和恢復它。

while IFS=, read -r server searchtxt; do 
    ... 
done