5

Я пытаюсь увидеть, что происходит, когда я пытаюсь убить процесс kernel_task . Поскольку kill -9 pid является командой для принудительного выхода из процесса, а pid kernel_task равен 0, я просто запустил kill -9 0 .

Вместо получения Permission Denied или Operation not permitted при уничтожении корневого процесса, вы просто получаете следующее:

Last login: Thu Jun 18 16:55:10 on ttys005
MacBook-Air:~ james$ kill -9 0

[Process completed]

... что странно, потому что попытка убить launchd (на один уровень ниже kernel_task) дает вам следующее:

-bash: kill: (1) - Operation not permitted

и все остальные корневые процессы.

Почему, черт возьми, он просто завершает процесс, который вызвал команду, вместо того, чтобы отправлять Operation not permitted , как все другие корневые процессы?

Бонусные баллы, если вы можете сказать мне ответ на этот вопрос: если вы создаете скрипт, который пытается убить kernel_task (и игнорирует SIGTERM), при запуске он выдаст Killed: 9 и вернется к bash. Почему он помещает это в стандартный вывод, когда убивает его? Почему не что-то более наглядное?

1 ответ1

4

pid для kernel_task равен 0

Вероятно, они используют PID 0, потому что это зарезервированный PID, и поэтому вы не можете отправлять сигналы процессу.

Я просто побежал kill -9 0 .

Команда kill * nix является более или менее прямым интерфейсом для системного вызова kill. Из документации системного вызова:

If pid is zero:
      Sig is sent to all processes whose group ID is equal to the process group ID of the sender, and
      for which the process has permission; this is a variant of killpg(2).

Другими словами, в вашем случае kill -9 0 - это просто причудливый способ отправить (фатальный) сигнал самому себе. (Подробнее о группах процессов.)

Почему, черт возьми, он просто завершает процесс, который вызвал команду

kill (если вы не настроили параметры оболочки) - это встроенная команда оболочки. Другими словами, оболочка вызывает системный вызов kill и это заставляет его уничтожать себя.

Попробуйте то же самое, но с внешней командой kill , например, /bin/kill -9 0 . В этом случае будет уничтожен только /bin/kill .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .