Выполнять несколько сценариев оболочки в последовательности после проверки состояния каждого сценария - PullRequest
0 голосов
/ 06 сентября 2018

у нас есть запрос на последовательное выполнение нескольких сценариев оболочки (сценариев, запускающих серверы приложений)

Реальная ставка заключается в том, что мы должны убедиться, что процесс (pid) запущен или нет, прежде чем переходить к следующему сценарию. если процесс не запущен, отобразите сообщение об ошибке и перейдите к следующему сценарию

Также отправьте консолидированное электронное письмо с ошибкой (какой сценарий был сбой) после завершения выполнения (выполнения) всех сценариев

Примечание: эти сервисы не зависят, мы просто проверяем статус после каждого скрипта

Вот то, что я придумал ... , пожалуйста, помогите

 #!/bin/bash

./script1.sh
PID=`ps -ef | grep c3f | grep -v grep | awk '{print $2}' | wc -l`
if [ $PID -ne 0 ]; then
        echo "error pls check";
 fi

./script2.sh
PID1=`ps -ef | grep d3f | grep -v grep | awk '{print $2}' | wc -l`
if [ $PID1 -ne 0 ]; then
        echo "error pls check";
 fi

./script3.sh
 PID2=`ps -ef | grep E3f | grep -v grep | awk '{print $2}' | wc -l`
if [ $PID2 -ne 0 ]; then
        echo "error pls check";
 fi

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вы можете использовать команду pgrep для поиска процессов по имени, например

для поиска процессов, имя которых включает c3f:

pgrep c3f

для поиска процессов, в состав которых входит полная командная строка c3f

pgrep -f c3f

Мы можем переписать сценарий следующим образом:

#!/bin/bash

declare -a PROCESSES_NOT_FOUND=()

./script1.sh
if ! pgrep -f c3f; then
    PROCESSES_NOT_FOUND+=(c3f)
    echo "Not found c3f, error pls check";
fi

./script2.sh
if ! pgrep -f d3f; then
    PROCESSES_NOT_FOUND+=(d3f)
    echo "Not found d3f, error pls check";
fi

./script3.sh
if ! pgrep -f E3f; then
    PROCESSES_NOT_FOUND+=(E3f)
    echo "Not found E3f, error pls check";
fi

echo "Not found these processes: ${PROCESSES_NOT_FOUND[@]}"

Или мы можем использовать массив для хранения сопоставления процессов и сценариев

#!/bin/bash

declare -A PROCESS_MAP
PROCESS_MAP[c3f]=./script1.sh
PROCESS_MAP[d3f]=./script2.sh
PROCESS_MAP[E3f]=./script3.sh

declare -a PROCESSES_NOT_FOUND=()

for PROCESS in "${!PROCESS_MAP[@]}"; do
    "${PROCESS_MAP[$PROCESS]}"
    if ! pgrep -f "$PROCESS"; then
        PROCESSES_NOT_FOUND+=("$PROCESS")
        echo "Not found $PROCESS, error pls check";
    fi
done

echo "Not found these processes: ${PROCESSES_NOT_FOUND[@]}"
0 голосов
/ 07 сентября 2018

Это то, что я придумал и протестировал с моим требованием

Спасибо всем за помощь

testC1.sh

#!/bin/sh

today=`date +%m%d`
err=0

./testCC.sh start s1a cc
PID1=`ps -ef|grep -E 'c35f.*s1a' | grep -v grep | awk '{print $2}'`
if [ "$PID1" -eq 0 ] || [ -z "$PID1" ]; then
        # PROCESS s1a not started
        err=$(( err + 1))
else
        echo "$(date) - Process s1a with $PID1 is running " > /tmp/log_"$today".log
fi

./testCC.sh start s1b cc
PID2=`ps -ef|grep -E 'c35f.*s1b' | grep -v grep | awk '{print $2}'`
if [ "$PID2" -eq 0 ] || [ -z "$PID2" ]; then
        # PROCESS s1b not started
        err=$(( err + 2))
else
        echo "$(date) - Process s1b is running: $PID2 " >> /tmp/log_"$today".log
fi

./testCC.sh start s2a cc
PID3=`ps -ef|grep -E 'c35f.*s2a' | grep -v grep | awk '{print $2}'`
if [ "$PID3" -eq 0 ] || [ -z "$PID3" ]; then
        # PROCESS s2a not started
        err=$(( err + 3))
else
        echo "$(date) - Process s2a with $PID3 is running " > /tmp/log_"$today".log
fi
./testCC.sh start s2b cc
PID4=`ps -ef|grep -E 'c35f.*s2b' | grep -v grep | awk '{print $2}'`
if [ "$PID4" -eq 0 ] || [ -z "$PID4" ]; then
        # PROCESS s2b not started
        err=$(( err + 4))
else
        echo "$(date) - Process s2b is running: $PID4 " >> /tmp/log_"$today".log
fi


if (( $err > 0 )); then
        # identify which PROCESS had the problem.
        if (( $err == 1 )); then
                condition="PROCESS s1a is down"
        elif (( $err == 2 )); then
                condition="PROCESS s1b is down"
        elif (( $err == 3 )); then
                condition="PROCESS s2a is down"
        elif (( $err == 4 )); then
                condition="PROCESS s2b is down"
        else
                condition="Process didnt started properly..Please Check"
        fi

#  send an email to get eyes on the issue

echo "$condition on $(hostname)
on $(date)\n please login to the server to check the process" | mail -s "Alert  Daily Bounce" emailid@corp.com

else

echo "Script on $(hostname) at $(date) sucessfully implemented" | mail -s "Notice  Daily Bounce"  -r 'emailid@corp.com' emailid@corp.com

fi
0 голосов
/ 07 сентября 2018

Вы можете использовать $!, чтобы получить PID последнего процесса в фоновом режиме. Вы можете добавить все, что хотите, в эти if блоки, чтобы отслеживать, что пошло не так. Команда wait ожидает завершения всех фоновых процессов. После этого вы можете распечатать все, что хотите, для последующей обработки.

#!/bin/bash

./script1.sh &
ps $! > /dev/null
if [ $? -ne 0 ]; then
    echo "error pls check";
fi

./script2.sh
ps $! > /dev/null
if [ $? -ne 0 ]; then
    echo "error pls check";
fi

./script3.sh
ps $! > /dev/null
if [ $? -ne 0 ]; then
    echo "error pls check";
fi

wait
...