Bei einem Shell-Prozess (z.B. sh
) und seinen untergeordneten Prozess (z. B. cat
), wie kann ich das Verhalten von Ctrl simulieren +C die Prozess-ID der Shell verwenden?
Das habe ich versucht:
Ausführen von sh
und dann cat
:
[[email protected] ~]$ sh
sh-4.3$ cat
test
test
Senden von SIGINT
zu cat
von einem anderen Terminal:
[[email protected] ~]$ kill -SIGINT $PID_OF_CAT
cat
das Signal empfangen und beendet (wie erwartet).
Das Senden des Signals an den übergeordneten Prozess scheint nicht zu funktionieren. Warum wird das Signal nicht an cat
weitergeleitet wenn es an seinen übergeordneten Prozess sh
gesendet wird ?
Das funktioniert nicht:
[[email protected] ~]$ kill -SIGINT $PID_OF_SH
Akzeptierte Antwort:
Wie CTRL +C funktioniert
Als erstes müssen Sie verstehen, wie CTRL +C funktioniert.
Wenn Sie CTRL drücken +C , sendet Ihr Terminal-Emulator ein ETX-Zeichen (end-of-text / 0x03).
Das TTY ist so konfiguriert, dass es beim Empfang dieses Zeichens ein SIGINT an die Vordergrundprozessgruppe des Terminals sendet. Diese Konfiguration kann angezeigt werden, indem Sie stty -a
ausführen und schauen Sie sich intr = ^C;
an .
Die POSIX-Spezifikation besagt, dass beim Empfang von INTR ein SIGINT an die Vordergrundprozessgruppe dieses Terminals gesendet werden soll.
Was ist die Vordergrundprozessgruppe?
Nun stellt sich also die Frage, wie bestimmen Sie, was die Vordergrundprozessgruppe ist?
Die Vordergrundprozessgruppe ist einfach die Gruppe von Prozessen, die alle von der Tastatur erzeugten Signale empfangen (SIGTSTP, SIGINT usw.).
Der einfachste Weg, die Prozessgruppen-ID zu ermitteln, ist die Verwendung von ps
:
ps ax -O tpgid
Die zweite Spalte ist die Prozessgruppen-ID.
Wie sende ich ein Signal an die Prozessgruppe?
Da wir nun die Prozessgruppen-ID kennen, müssen wir das POSIX-Verhalten simulieren, ein Signal an die gesamte Gruppe zu senden.
Dies kann mit kill
erfolgen durch Setzen eines -
vor der Gruppen-ID.
Wenn Ihre Prozessgruppen-ID beispielsweise 1234 ist, würden Sie Folgendes verwenden:
kill -INT -1234
Simulieren Sie CTRL +C mit der Terminalnummer.
Das Obige deckt also ab, wie man CTRL simuliert +C als manueller Prozess. Was aber, wenn Sie die TTY-Nummer kennen und CTRL simulieren möchten +C für dieses Terminal?
Das wird sehr einfach.
Verwandte:Bash-Konvertierung von \xC3\x89 in É?
Nehmen wir an $tty
ist das Terminal, auf das Sie abzielen möchten (dies erhalten Sie, indem Sie tty | sed 's#^/dev/##'
ausführen im Terminal).
kill -INT -$(ps h -t $tty -o tpgid | uniq)
Dadurch wird ein SIGINT an die Vordergrundprozessgruppe von $tty
gesendet ist.