Dato un processo di shell (ad es. sh
) e il relativo processo figlio (ad es. cat
), come posso simulare il comportamento di Ctrl +C utilizzando l'ID di processo della shell?
Questo è quello che ho provato:
Esecuzione di sh
e poi cat
:
[[email protected] ~]$ sh
sh-4.3$ cat
test
test
Invio di SIGINT
a cat
da un altro terminale:
[[email protected] ~]$ kill -SIGINT $PID_OF_CAT
cat
ricevuto il segnale e terminato (come previsto).
L'invio del segnale al processo padre non sembra funzionare. Perché il segnale non viene propagato a cat
quando viene inviato al processo padre sh
?
Questo non funziona:
[[email protected] ~]$ kill -SIGINT $PID_OF_SH
Risposta accettata:
Come CTRL +C funziona
La prima cosa è capire come CTRL +C funziona.
Quando premi CTRL +C , l'emulatore di terminale invia un carattere ETX (end-of-text / 0x03).
Il TTY è configurato in modo tale che quando riceve questo carattere, invia un SIGINT al gruppo di processi in primo piano del terminale. Questa configurazione può essere visualizzata eseguendo stty -a
e guardando intr = ^C;
.
La specifica POSIX dice che quando viene ricevuto INTR, dovrebbe inviare un SIGINT al gruppo di processi in primo piano di quel terminale.
Cos'è il gruppo di processi in primo piano?
Quindi, ora la domanda è:come si determina qual è il gruppo di processi in primo piano?
Il gruppo di processi in primo piano è semplicemente il gruppo di processi che riceverà tutti i segnali generati dalla tastiera (SIGTSTP, SIGINT, ecc.).
Il modo più semplice per determinare l'ID del gruppo di processi è utilizzare ps
:
ps ax -O tpgid
La seconda colonna sarà l'ID del gruppo di processi.
Come faccio a inviare un segnale al gruppo di processi?
Ora che sappiamo qual è l'ID del gruppo di processi, dobbiamo simulare il comportamento POSIX dell'invio di un segnale all'intero gruppo.
Questo può essere fatto con kill
inserendo un -
davanti all'ID del gruppo.
Ad esempio, se l'ID del gruppo di processi è 1234, dovresti utilizzare:
kill -INT -1234
Simula CTRL +C utilizzando il numero del terminale.
Quindi quanto sopra spiega come simulare CTRL +C come processo manuale. Ma cosa succede se si conosce il numero TTY e si desidera simulare CTRL +C per quel terminale?
Diventa molto facile.
Correlati:Bash converte \xC3\x89 in É?
Assumiamo $tty
è il terminale a cui vuoi rivolgerti (puoi ottenerlo eseguendo tty | sed 's#^/dev/##'
nel terminale).
kill -INT -$(ps h -t $tty -o tpgid | uniq)
Questo invierà un SIGINT a qualunque sia il gruppo di processi in primo piano di $tty
è.