Se in bash eseguo a | b | c | d
sulla riga di comando e quindi preme ^C, quale processo riceve il segnale?Invio di SIGINT dalla tastiera ai comandi con pipe in bash
6
A
risposta
9
In breve, lo fanno tutti.
Quando si imposta una pipeline, la shell crea uno process group. ^C viene interpretato dalla disciplina della linea del kernel come richiesta dell'utente di interrompere il gruppo di processi attualmente in esecuzione in primo piano. L'invio di un segnale come SIGINT
a un gruppo di processi invia automaticamente il segnale a tutti i processi nel gruppo.
2
mi piace la sperimentazione meglio:
#!/bin/bash
# FILE /tmp/bla.sh
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
MY_ID=$1 # Identifier for messages
function ctrl_c() {
echo >&2 "GOODBYE $MY_ID"
exit
}
# This will continue until interrupted, e.g. if the input/output get closed
cat
# If we somehow got to the end
echo >&2 "grace $MY_ID"
loro concatenazione, l'esecuzione e la rottura di loro
[email protected]:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2
^CGOODBYE 2
GOODBYE 1
0
Come si può vedere, entrambe le esecuzioni ottenuto il segnale di interruzione, nel senso che tutti vengono uccisi. Inoltre, l'ordine in cui emettono che sono stati uccisi è casuale, ad esempio
[email protected]:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 | /tmp/bla.sh 3 | /tmp/bla.sh 4
^CGOODBYE 2
GOODBYE 4
GOODBYE 1
GOODBYE 3