17 Şubat 2019 Pazar

bash kodlama - trap built-in komutu

Giriş
trap kullanırken 
1. önce çalıştırılacak komut 
2. sonra yakalanmak istenen sinyal belirtilir.

TERM Signal
Örnek
Bash signal'leri subprocess'lere göndermez. trap ile bunları yakalayıp cleanup yapmak için şöyle yaparız
#!/bin/bash
...
trap 'kill -TERM $PID' TERM INT
$JAVA_EXECUTABLE $JAVA_ARGS &
PID=$!
wait $PID
trap - TERM INT
wait $PID
EXIT_STATUS=$?
...
ERR Signal
Örnek
Herhangi bir komut çalışırken hata verirse bunu yakalamak için şöyle yaparız
trap 'echo "Error: $? occurred" >> log.txt' ERR some_command some_bad_command some_command veya #!/bin/bash trap 'error_handler $? $LINENO' ERR error_handler () { echo "Error: $1 occurred on line $2" } # rest of code...


INT Signal
Örnek
Ctrl + C ile break yaparak döngüyü sonlandırmak için şöyle yaparız.
#!/bin/bash

trap break INT

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

    echo loop "$c" before sleep

    # sleep potentially for a long time
    sleep "$2"

    echo loop "$c" after sleep

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE

echo outside
Çıktı olarak şunu alırız.
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Örnek
Ctrl + C ile echo+ exit yapmak için şöyle yaparız.
#!/bin/bash

(
trap "echo interrupted.; exit 0" INT
while true; do
        echo "running some task..."
        some heavy task 
        echo "running sleep..."
        sleep 5;
        echo "iteration end."
done
)

echo "script end."
EXIT Signal
Örnek

Bash sonlanırken (EXIT) bir metod çağırmak için şöyle yaparız.
#!/bin/bash
# Create a temporary directory (these will usually be created under /tmp or /var/tmp/)
scripttmp=$(mktemp -d)

cleanup() {                      # Declare a cleanup function
    rm -rf "${scripttmp}"   # ... which deletes the temporary directory we just created
}

trap cleanup EXIT # Ask Bash to call cleanup on exit
# When exiting, the temporary directory will be deleted
exit
Örnek
Sadece bazı exit kodları için şöyle yaparız.
trap cleanup 0 1 2 3 6

cleanup()
{
  ...
}

Hiç yorum yok:

Yorum Gönder