Bash trap не запускается, когда коды выхода 1 помещаются в некоторое случайное местоположение

#bash #bash-trap

#bash #bash-trap

Вопрос:

Я использую bash trap, чтобы убедиться, что одна функция выполняется любой ценой. Я знаю, что trap не относится конкретно к exitO или 1. Вот что я сделал.

 #!/bin/bash

set -e

#array to store server and deployed status
declare -A server_deployed


#path to file containing the server inventory 
    readonly filepath="/var/jenkins_home/workspace/server_list.txt"
    #array to store to list of IPS
    declare -A result #associative array

    if [[ $TARGET == "ALL" ]]; then
        while read line ; do
           server_name=` echo $line | cut -d= -f1 `
           result =(["$server_name"]=${line#*=})
        done < $filepath
    else
       singleserver=`cat $filepath | grep "$TARGET"`
       server_name=`echo $singleserver| cut -d= -f1 ` # get the servername 
       serverip=`echo $singleserver| cut -d= -f2 ` # get tje server ip
       result =(["$server_name"]=$serverip) # gets the ip which is after equalto
     fi


#function to send slack notification everytime
function sendMessage(){

    for sd in "${!server_deployed[@]}"
      do
        echo "#########################################################"
         echo "Sucecssfully deployed on $sd" 
         echo "#########################################################"
     done

   #let find the unsuccess list ,for which we need to find the array diff
   for server_name in "${!result[@]}"
     do
       for sd in "${!server_deployed[@]}"
         do
           if [[ "$server_name" != "$sd" ]]; then
             echo "Failed to deploy on $server_name"
           fi
        done
     done
}

trap "sendMessage" INT EXIT

for server in "${!result[@]}"
  do

    upstream="MBM-TEST-ADMIN-BUILD"
    #bundle filename
    bundle="mbm_admin_dist"

    name=$server
    instance=${result[$name]}

    #------copying the hash.php in build job to the deployed server home location
    # ssh and move to desired location
     sudo scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /tmp/test/admin_hash.json ubuntu@$instance:/home/ubuntu/

    mbmcms_workspace="/var/jenkins_home/workspace/$upstream"
    cd $mbmcms_workspace


    #remove if exist
    if [ -e "$bundle.zip" ]
    then
        echo "Already Exist so Removing it First !!"
        rm -f  $bundle.zip
    fi

    #check if the dist folder exist that comes from successful build
    if [ ! -d "dist" ]; then
      echo "--------------------------------------------------------------"
      echo "The dist folder does not exist, Please run BUILD job First !!"
      echo "--------------------------------------------------------------"
      exit 1
    fi

    #zip the file from the TEST amp; Build jobs 
    echo "starting to zip mbm-admin dist file created after test and build success!!"
    zip --symlinks -x *.git* -r $bundle ./dist



    #---------------------------------------------------------------
    # copy development.php if non-production else copy production.php
    # the file goes to the view/cms/
    #---------------------------------------------------------------
    sudo scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null development.php ubuntu@$instance:/home/ubuntu
    sudo scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null production.php ubuntu@$instance:/home/ubuntu


    #copy the bundle file to instance
    scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r $bundle.zip ubuntu@$instance:/home/ubuntu/


    ssh -tt -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@$instance '

    SOURCE_FOLDER='/home/ubuntu/mbm-admin/dist/'
    DESTINATION_FOLDER='/home/ubuntu/wpdata/plugins/manager/app/views/admin/admin_console/dist/'

    rm -rf mbm-admin
    mkdir -p mbm-admin
    mv mbm_admin_dist.zip mbm-admin
    cd mbm-admin


    unzip mbm_admin_dist.zip
    rm -f mbm_admin_dist.zip



    sudo rsync -arz --force --delete --progress  $SOURCE_FOLDER $DESTINATION_FOLDER

    #moving the copied file to the /app/views/admin/admin_console
    sudo mv /home/ubuntu/development.php /home/ubuntu/wpdata/plugins/manager/app/views/admin/admin_console
    sudo mv /home/ubuntu/production.php /home/ubuntu/wpdata/plugins/manager/app/views/admin/admin_console


    #moving the hash.php to the desired location
    sudo cp -fv /home/ubuntu/admin_hash.json /home/ubuntu/wpdata/plugins/manager/app/views/admin/admin_console/hash.json
    '
    server_deployed =(["$server"]="SUCCESS")
  

Выполнено

Вот ловушка, как показано в разделе сценария

 trap "sendMessage" INT EXIT
  

Мне нужно запускать функцию SendMessage всякий раз, когда какой-либо код выхода
обнаружено или программа завершает работу из-за какой-либо ошибки.

Проблема: Когда я помещаю exit 1 в конец скрипта, функция вызывается ловушкой, но предположим, что если я помещу ее где-нибудь в середине или точно после запуска основного цикла for, ловушка не поймает код выхода.

Чего именно я здесь не понимаю или не хватает?

Комментарии:

1. Попробуйте переместить trap команду в начало скрипта.

2. Это тоже не решает проблему @choroba

3. Не имеющая отношения к вашему вопросу попытка заключить одинарные кавычки в last ssh является ошибкой, но, вероятно, безвредна.

4. Измените свою вторую строку на: set -euo pipefail . Это неофициальный строгий режим для bash — делает ваш скрипт безопаснее и проще в разработке. -e exit on first error , -u exit when an undefined variable such as $FO0 is accessed , -o pipefail exit when | any |cmd | in | a | pipe has exitcode != 0 . Добавление x в set выведет все команды для отладки. set -euxo pipefail