Ik heb een bashscript geschreven waarin ik een loop een aantal externe applicaties aanroep om taken te verrichten. Die taken kunnen lang duren, zoals rsync. Ik wil in mijn script een manier inbouwen om het script netjes te stoppen:
Een voorbeeld zegt meer dan 1000 woorden:
Ik wil dus eigenlijk voor elkaar krijgen dat de /bin/sleep afgemaakt wordt bij 1x Ctrl-C, waarna de volgende iteratie van de loop stopt, maar dat de /bin/sleep bij een tweede Ctrl-C wel afgebroken wordt.
- eenmaal op Ctrl-C drukken geeft een boodschap en zet een variabele. De volgende iteratie in de loop wordt niet gestart
- nogmaals op Ctrl-C drukken stopt het script per direct
Een voorbeeld zegt meer dan 1000 woorden:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #!/bin/bash i_should_exit=0 function asap_exit() { if [ $i_should_exit == 1 ]; then echo "second SIGINT caught, exit immediately" exit 1 else echo "SIGINT caught, will exit after this loop. Give another SIGINT to exit immediately" i_should_exit=1 fi } trap asap_exit SIGINT while [ /bin/true ]; do echo "sleeping" /bin/sleep 20 echo "done" [ $i_should_exit == 1 ] && exit 1 done |
Ik wil dus eigenlijk voor elkaar krijgen dat de /bin/sleep afgemaakt wordt bij 1x Ctrl-C, waarna de volgende iteratie van de loop stopt, maar dat de /bin/sleep bij een tweede Ctrl-C wel afgebroken wordt.