Bash
bash函式執行兩次
該腳本具有執行重新執行主機腳本但執行兩次的函式的陷阱。
#!/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 }