Obiettivo finale: Lo script BASH in attesa della fine dei lavori in background non viene interrotto il primo Ctrl-c
; invece, richiede un secondo Ctrl-c
per uscire.bash: è possibile richiedere il doppio Ctrl-c per uscire da uno script?
Sono perfettamente a conoscenza di come funziona il trap
integrato in BASH. È possibile:
Si usa per ignorare un segnale complesso (ad esempio,
trap '' 2
) ... oche consente di orientare comandi arbitrari eseguiti prima che un segnale funzione originale è permesso che accada (es ,
trap cmd 2
, dovecmd
viene eseguito prima che lo script genitore sarà interrotto a causa diSIGINT
)
Quindi la domanda si riduce a questo:
012.351.Come posso efficacemente combinare & insieme, cioè, impedire il risultato finale un segnale comporterebbe (- ad esempio, arrestare script annullando causa
SIGINT
) ma anche di fare che il segnale causa qualcos'altro (- ad esempio, incrementa un contatore, controlla il contatore e condizionalmente stampa un avviso o esce).
Più semplicemente:
Come posso fare un segnale di fare qualcosa di completamente diverso; non basta inserire un lavoro prima che faccia la sua cosa.
Ecco alcuni esempi di codice per dimostrare a cosa sto mirando; tuttavia, ovviamente non funziona, perché trap
può fare solo o dall'alto.
#!/bin/bash
declare -i number_of_times_trap_triggered
cleanup_bg_jobs() {
number_of_times_trap_triggered+=1
if [[ ${number_of_times_trap_triggered} -eq 1 ]]; then
echo "There are background jobs still running"
echo "Hit Ctrl-c again to cancel all bg jobs & quit"
else
echo "Aborting background jobs"
for pid in ${bg_jobs}; do echo " Killing ${pid}"; kill -9 ${pid}; done
fi
}
f() { sleep 5m; }
trap cleanup_bg_jobs 2
bg_jobs=
for job in 1 2 3; do
f &
bg_jobs+=" $!"
done
wait
Quindi questo è l'uscita si finisce per ottenere quando si preme Ctrl-c
volta.
[rsaw:~]$ ./zax
^CThere are background jobs still running
Hit Ctrl-c again to cancel all bg jobs & quit
[rsaw:~]$ ps axf|tail -6
24569 pts/3 S 0:00 /bin/bash ./zax
24572 pts/3 S 0:00 \_ sleep 5m
24570 pts/3 S 0:00 /bin/bash ./zax
24573 pts/3 S 0:00 \_ sleep 5m
24571 pts/3 S 0:00 /bin/bash ./zax
24574 pts/3 S 0:00 \_ sleep 5m
Naturalmente potrei modificare che per ripulire i lavori sul primo Ctrl-c
, ma non è quello che voglio. Voglio impedire a BASH di uscire dopo che la prima trappola è stata attivata ... fino a quando non viene attivata una seconda volta.
PS: Piattaforma di destinazione è Linux (io non poteva fregare di meno rispetto POSIX) con BASH v4 +
Di solito in questo caso, i due Ctrl + C devono essere continui per interrompere il programma. Quindi, una soluzione migliore dovrebbe riportare ATTEMP a 0 quando viene catturato un tasto giù. –
Grazie per aver provato Wally, ma quello che stai offrendo in realtà non risponde a quello che ho chiesto. Si spegnerà dopo che è stato eseguito il primo comando echo Shutdown. – rsaw
PS: Ho aggiornato il mio post con alcuni dei miei codici di esempio per mostrare che 'trap' non funziona come pensi che funzioni. (A meno che non sia pazzo.) – rsaw