Daný proces shellu (např. sh
) a jeho podřízený proces (např. cat
), jak mohu simulovat chování Ctrl +C pomocí ID procesu prostředí?
Zkoušel jsem toto:
Spuštění sh
a poté cat
:
[[email protected] ~]$ sh
sh-4.3$ cat
test
test
Odesílání SIGINT
na cat
z jiného terminálu:
[[email protected] ~]$ kill -SIGINT $PID_OF_CAT
cat
přijal signál a skončil (jak se očekávalo).
Zdá se, že odesílání signálu nadřazenému procesu nefunguje. Proč se signál nešíří do cat
při odeslání jeho nadřazenému procesu sh
?
Toto nefunguje:
[[email protected] ~]$ kill -SIGINT $PID_OF_SH
Přijatá odpověď:
Jak CTRL +C funguje
První věcí je pochopit, jak CTRL +C funguje.
Když stisknete CTRL +C , váš emulátor terminálu odešle znak ETX (konec textu / 0x03).
TTY je nakonfigurován tak, že když přijme tento znak, odešle SIGINT skupině procesů na popředí terminálu. Tuto konfiguraci lze zobrazit příkazem stty -a
a podíváme se na intr = ^C;
.
Specifikace POSIX říká, že když je přijat INTR, měl by odeslat SIGINT skupině procesů v popředí tohoto terminálu.
Co je to skupina procesů v popředí?
Nyní je tedy otázkou, jak určíte, co je to skupina procesů v popředí?
Skupina procesů v popředí je jednoduše skupina procesů, která bude přijímat jakékoli signály generované klávesnicí (SIGTSTP, SIGINT atd.).
Nejjednodušší způsob, jak určit ID skupiny procesů, je použít ps
:
ps ax -O tpgid
Druhý sloupec bude ID skupiny procesů.
Jak pošlu signál skupině procesů?
Nyní, když víme, jaké je ID skupiny procesů, musíme simulovat chování POSIX při odesílání signálu celé skupině.
To lze provést pomocí kill
vložením -
před ID skupiny.
Pokud je například ID vaší procesní skupiny 1234, použili byste:
kill -INT -1234
Simulovat CTRL +C pomocí čísla terminálu.
Výše uvedené popisuje, jak simulovat CTRL +C jako manuální proces. Ale co když znáte číslo TTY a chcete simulovat CTRL +C pro tento terminál?
To je velmi snadné.
Související:Bash převést \xC3\x89 na É?
Předpokládejme $tty
je terminál, na který chcete cílit (můžete to získat spuštěním tty | sed 's#^/dev/##'
v terminálu).
kill -INT -$(ps h -t $tty -o tpgid | uniq)
To odešle SIGINT do jakékoli skupiny procesů v popředí $tty
je.