Bash

bash函式執行兩次

  • March 18, 2022

該腳本具有執行重新執行主機腳本但執行兩次的函式的陷阱。

#!/bin/bash

LOCK="/tmp/performanceScript.lock"

exec_func () {
#Creando Script de Vida Eterna.

rm -f $LOCK
cd $( dirname '${BASH_SOURCE[0]}' )
echo "Volvio a la vida" >> /tmp/secuancia_performanceScript.log
$( which bash ) performanceScript2.sh &
exit $?

}

secuencia=0

if (set -o noclobber; echo $$ > "$LOCK") 2> /dev/null;
then
   trap 'exec_func' INT TERM EXIT SIGKILL

   while true; do
    echo "El numero es $secuencia" >> /tmp/secuancia_performanceScript.log
    ((secuencia++))
    sleep 1
   done

   rm -f $LOCK
   trap - INT TERM EXIT

else
   echo "ya se está ejecutando: $(cat $LOCK)"
fi

看到調試,函式執行了兩次。

^C
++ exec_func
++ rm -f /tmp/performanceScript.lock
+++ dirname '${BASH_SOURCE[0]}'
++ cd .
++ echo 'Volvio a la vida'
++ exit 0
+ exec_func
+ rm -f /tmp/performanceScript.lock
+++ which bash
++ dirname '${BASH_SOURCE[0]}'
++ /bin/bash performanceScript2.sh
+ cd .
+ echo 'Volvio a la vida'
+ exit 0
++ which bash
+ /bin/bash performanceScript2.sh
ya se está ejecutando: 13963

為什麼 exec_func 函式會執行兩次?

您正在對所有這些信號設置陷阱:

trap 'exec_func' INT TERM EXIT SIGKILL

這使得exec_func打開INT(ctrl-C)並再次打開EXIT(腳本結束)。

只選擇一個(如果你需要的話)喜歡INT

trap 'exec_func' INT

或者辨識與此類似的被擷取的信號,並使用 case 語句來決定要做什麼。

輸入清理方法後,您應該清除陷阱。

像這樣的東西

# trap ctrl-c and call ctrl_c()
trap ctrl_c INT TERM ERR EXIT TSTP 

function ctrl_c() {
   trap '' INT TERM ERR EXIT TSTP 
   echo "cleanup"
   echo "bye"
   exit 0
}

引用自:https://unix.stackexchange.com/questions/462392