2015-04-30 3 views
1

Я пишу код, который в настоящее время SSH на несколько серверов поочередно и дистанционно проверяет, работает ли процесс. Конечная цель - получить уведомление по электронной почте, если процесс не запущен. У меня много работы.инструкция if, SSH и выполнение удаленных команд

Однако я также хочу получить предупреждение, если соединение SSH не удастся. Проблема в том, что бы я ни старался, я не могу заставить ее работать с моим текущим кодом if, 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 

Это будет удобно, если сбой либо ssh или pkill команды терпят неудачу.

Еще одно усовершенствование, которое вы могли бы сделать, - это переопределить $IFS только на время команды read. Это позволит вам избавиться от кода, чтобы сохранить и восстановить его.

while IFS=, read -r server searchtxt; do 
    ... 
done 
Смежные вопросы