Что происходит за кулисами, когда пользователь дает команду Quit
или Force Quit
извне целевого приложения (например, из Activity Monitor)?
решение1
Как правило, операция «Выход» выполняетсянетсигнал; этоСобытие Apple, который представляет собой тот же тип межпроцессного взаимодействия, который используется для сценариев AppleScript и для открытия файлов или URL-адресов в уже запущенных приложениях, и происходит из родословной Mac OS, а не Unix.
Процесс должен специально зарегистрироваться для получения событий Apple, и такие процессы являются либо процессами графического интерфейса, либо, по крайней мере, связаны с сеансом рабочего стола (что, за исключением Activity Monitor, является единственным способом заставить их вообще завершить работу).
Однако если вы «завершите» процесс из Activity Monitor и этот процесснетзарегистрирован для получения событий Apple, вместо этого будет отправлен SIGTERM (15).
решение2
Вы можете использовать dtrace, чтобы увидеть, какие сигналы отправляются процессам:
sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d", execname, args[2], args[1]->pr_pid); }'
Если вы принудительно завершаете приложение, отображаемое в Dock, сигнал обычно равен -15 (TERM). Но если вы принудительно завершаете фоновый процесс из Activity Monitor, это обычно равно -9 (KILL).
решение3
Вы можете просматривать события Force Quit для приложений GUI, отправленных в system.log
. Или используйте dtrace, как указано в этой теме. С dtrace вы получаете большую детализацию, но вам потребуются привилегии root.