Welche Signale sendet OS X für die Befehle Quit und Force Quit?

7

Was passiert hinter den Kulissen, wenn ein Benutzer einen Quitoder Force QuitBefehl von außerhalb der Zielanwendung erteilt (z. B. vom Aktivitätsmonitor)?

Schwarzlicht scheint
quelle

Antworten:

7

In der Regel ist der Vorgang „Beenden“ kein Signal. Es handelt sich um ein Apple-Ereignis , bei dem es sich um die gleiche Art der prozessübergreifenden Kommunikation handelt, die für AppleScript-Skripte und zum Öffnen von Dateien oder URLs in bereits ausgeführten Anwendungen verwendet wird. Es stammt nicht von Unix, sondern von Mac OS.

Ein Prozess muss speziell registriert werden, um Apple Events empfangen zu können. Solche Prozesse sind entweder GUI-Prozesse oder zumindest einer Desktopsitzung zugeordnet (die außerhalb von Activity Monitor die einzige Möglichkeit ist, die zum Beenden führen kann).

Wenn Sie jedoch einen Prozess in Activity Monitor "beenden" und dieser Prozess nicht für den Empfang von Apple Events registriert wurde, wird stattdessen SIGTERM (15) gesendet.

Kevin Reid
quelle
6

Mit dtrace können Sie sehen, welche Signale an Prozesse gesendet werden:

sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d", execname, args[2], args[1]->pr_pid); }'

Wenn Sie das Beenden einer im Dock angezeigten Anwendung erzwingen, ist das Signal normalerweise -15 (TERM). Wenn Sie jedoch das Beenden eines Hintergrundprozesses aus dem Aktivitätsmonitor erzwingen, ist dies normalerweise -9 (KILL).

Lri
quelle
Interessant. Wie wird zwischen Apps und Hintergrundprozessen unterschieden?
Blacklight Shining
Ich habe es nicht mit so vielen Prozessen getestet, aber ich meinte Prozesse, die keine Menüleiste haben oder nicht im Dock oder im Force-Quit-Fenster angezeigt werden.
Lri
1

Sie können Force Quit-Ereignisse für GUI-Anwendungen anzeigen, an die gesendet wird system.log. Oder verwende dtrace wie in diesem Thread gepostet. Mit dtrace erhalten Sie mehr Granularität, benötigen jedoch Root-Rechte.

1.61803
quelle
-1 (ungenau): /var/log/system.logNimmt keine Signale auf.
Blacklight Shining
1
@BlacklightShining Starten Sie TextEdit.app und erzwingen Sie das Beenden über Activity Monitor.app. Sie sollten eine Zeile wie diese sehen. Apr 28 13:04:21 com.apple.launchd.peruser.501[136] ([0x0-0x3e13e1].com.apple.TextEdit[5336]): Exited: Terminated: 15Das Quit-Ereignis wird jedoch nicht registriert.
1.61803
1
Zugegeben, das funktioniert für GUI-Apps. Wenn Sie jedoch einen anderen Prozess starten und ihn signalisieren, wird er nicht protokolliert. Daher können Sie die gesendeten Signale im Allgemeinen nicht anzeigen system.log.
Blacklight Shining
1
@BlacklightShining Ich habe meinen Beitrag überarbeitet, um Ihren Kommentar wiederzugeben.
1.61803