Как выйти из всего сценария оболочки при использовании ssh - PullRequest
0 голосов
/ 11 октября 2019

Мы находимся в ситуации, когда нам нужно проверить состояние процесса через SSH и выйти из ssh и скрипта, если процесс запущен, и вызвать электронное письмо, если он не запущен

Ниже приведен фрагменттекущий скрипт, который вызывает функцию status_email в обоих случаях.

Я ищу вашу помощь, чтобы вызвать скрипт только тогда, когда процесс не запущен


status_email{
******
****
}

for hostname in `cat ai_hosts.txt`; do
ssh actional@"$hostname" /bin/sh << 'EOF'
pid=`ps -ef | grep <<Process_Details>> | grep -v grep | awk -F ' ' {print'$2'}`
if [ "${pid:-null}" = null ]; then
        echo "not running"
else
echo "running"
exit
fi
EOF
         status_email;

1 Ответ

0 голосов
/ 14 ноября 2019

Вы можете сохранить вывод ssh в переменной, затем проверить переменную и, в зависимости от ее значения, сделать что-нибудь. Например, если вы сохраните следующий код в remote-process-check.sh

#!/bin/sh

host=your-host-name-or-ip-address

status_email () {
    echo 'Status email was sent.';
}

output=$(ssh root@"$host" "ps -C $1 >/dev/null && echo 'Running' || echo 'Not running'")

if [ "$output" = 'Not running' ]; then
    status_email
fi

Вы можете использовать его следующим образом:

bash remote-process-check.sh process-name
bash remote-process-check.sh mysqld
bash remote-process-check.sh apache2

и если процессне работает status_email Функция будет вызвана, и вы увидите «Сообщение о статусе было отправлено.» в вашей консоли.

Интересная часть скрипта:

output=$(ssh root@"$host" "ps -C $1 >/dev/null && echo 'Running' || echo 'Not running'")

, где с помощью ps -C $1 вы проверяете, запущен ли процесс, с >/dev/null вы перенаправляете вывод в черную дыру, и если команда выполнена успешно, это означает, что процесс выполняется echo 'Running', иначе выполняется echo 'Not running', который хранится в переменной output

...