Was passiert hinter den Kulissen, wenn ein Benutzer einen Quit
oder Force Quit
Befehl von außerhalb der Zielanwendung erteilt (z. B. vom Aktivitätsmonitor)?
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.
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).
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.quelle
/var/log/system.log
Nimmt keine Signale auf.Apr 28 13:04:21 com.apple.launchd.peruser.501[136] ([0x0-0x3e13e1].com.apple.TextEdit[5336]): Exited: Terminated: 15
Das Quit-Ereignis wird jedoch nicht registriert.system.log
.