Как убить mac os

Обновлено: 05.07.2024

Бывает, что ваш Mac выдает системные ошибки? Бывает, к сожалению. Загруженные приложения никак не реагируют на команды, а в памяти остаются один или несколько невыгруженных процессов. Эти и многие другие проблемные моменты решаются практически в пару нажатий. Настоятельно советую вам прочитать инструкцию, изложенную ниже, – так вы избавите себя от лишних хлопот при дальнейшей эксплуатации Мака.

Принудительное завершение активного приложения с клавиатуры

Для того, чтобы принудительно завершить активную задачу в Mac OS X, необходимо удерживать в течение нескольких секунд четыре кнопки Command + Option + Shift + Escape. Это самый быстрый способ выгрузить зависшее программное обеспечение в Mac OS X.

Окно «Принудительное завершение программ»

Сочетанием клавиш Command + Option + Escape мы добиваемся появления окна «Принудительное завершение приложения», после чего выбираем пункт «Завершить» для закрытия программы. Проделанная операция является более упрощенным вариантом команды в Мониторинге системы, позволяющей высвободить из памяти сразу несколько процессов.

Принудительное завершение программы из Дока

Необходимо выполнить следующую комбинацию: наводим курсор на иконку в Доке и, удерживая на клавиатуре ALT (Option), кликаем мышку. В результате зависшее приложение будет принудительно закрыто, причем без дополнительных подтверждений.

Принудительное завершение приложения из меню Apple

Удерживаем на клавиатуре клавишу Shift и делаем клик мышкой по логотипу Apple в верхней строке меню. Теперь выбираем команду «Завершить «…» принудительно». Данный способ наиболее простой для запоминания. Однако случается так, что компьютер никак не реагирует на нажатие этих клавиш.

Используем Мониторинг системы

Для того, чтобы запустить системную утилиту Мониторинг системы, следует нажать сочетание клавиш Command + Space и ввести в окне Spotlight название программы. После появления диалогового окна находим «зависшее» приложение либо по названию (как правило, задачи, невосприимчивые к воздействию, помечаются красным цветом), либо по идентификационному номеру (ID), а затем нажимаем «Завершить процесс». Данный метод выгрузки из памяти ненужного ПО очень похож на тот, что используется в Windows, только вместо Мониторинга системы там Диспетчер задач.

Используем Терминал для выгрузки процессов

В том случае, если ни один из вышеперечисленных способов вам не помог, самый действенный метод в этой ситуации – воспользоваться командной строкой. Запустите Терминал и введите одну из следующих команд:

К примеру, командой «killall Safari» вы убьете все процессы, связанные с интернет-браузером. А в том случае, если вам известен ID открытого приложения, которое можно найти с помощью команд «ps» или «ps aux», вы можете выгрузить «зависшую» программу следующим способом:

Следует быть крайне аккуратным при совершении действий, направленных на принудительное закрытия программ. Любое завершение процессов может вызывать аварийное прекращение работы операционной системы. А если вы работаете еще и с командной строкой, то это может привести к потере несохраненных данных и сбою системных настроек.

Можно стереть Mac и переустановить macOS, используя встроенную систему восстановления Mac — режим восстановления macOS.

ПРЕДУПРЕЖДЕНИЕ. При стирании компьютера Mac вся информация с него удаляется. Перед началом стирания выполните резервное копирование содержимого компьютера Mac с помощью Time Machine.

На компьютере Mac с чипом Apple или на компьютере Mac с процессором Intel и чипом Apple T2 Security Chip.

Ваш компьютер должен быть подключен к интернету. При выполнении переустановки на ноутбуке Mac подключите адаптер питания к сети питания.

Стирание Mac с помощью Ассистента стирания.

Перезагрузите компьютер Mac.

Выберите меню «Apple» > «Выключить», нажмите и удерживайте кнопку питания, пока не появится надпись «Загрузка параметров запуска», выберите «Параметры», нажмите «Продолжить», затем следуйте инструкциям на экране.

В окне приложения «Восстановление» выберите «Переустановить» для Вашей версии macOS, нажмите «Продолжить», затем следуйте инструкциям на экране.

На компьютере Mac с процессором Intel без чипа Apple T2 Security Chip.

Ваш компьютер должен быть подключен к интернету. При выполнении переустановки на ноутбуке Mac подключите адаптер питания к сети питания.

Выберите пункт меню «Apple»


> «Перезагрузить» и сразу же нажмите и удерживайте сочетание клавиш Command-R.

В окне приложения «Восстановление» выберите «Дисковая утилита», затем нажмите «Продолжить».

В боковом меню Дисковой утилиты выберите том, который нужно стереть, и нажмите кнопку «Стереть» на панели инструментов.

Введите имя тома, нажмите меню «Формат» и выберите APFS, а затем нажмите «Стереть группу томов».

Когда операция будет выполнена, нажмите «Готово», затем выберите «Дисковая утилита» > «Завершить Дисковую утилиту».

В окне приложения «Восстановление» выберите «Переустановить» для Вашей версии macOS, нажмите «Продолжить», затем следуйте инструкциям на экране.

Если Вы хотите стереть все данные с Mac без последующей переустановки macOS с целью восстановления заводских настроек перед обменом или продажей Mac, см. Стирание данных с компьютера Mac.

Привет, Хабр! Сегодня мне хотелось бы поговорить о том, как можно защитить процессы от посягательств злоумышленников в macOS. Например, это полезно для антивируса или системы резервного копирования, особенно в свете того что под macOS существует сразу несколько способов “убить” процесс. Об этом и о методах защиты читайте под катом.

image


Классический способ “убить” процесс

Всем известный способ “убить” процесс — послать сигнал об SIGKILL процессу. Через bash можно вызвать стандартные “kill -SIGKILL PID” или “pkill -9 NAME” для убийства. Команда “kill” известна еще со времен UNIX и доступна не только в macOS, но и на других UNIX-like системах.

Также как и в UNIX-like системах, macOS позволяет перехватить любые сигналы к процессу кроме двух — SIGKILL и SIGSTOP. В этой статье будет в первую очередь рассматриваться сигнал SIGKILL, как сигнал, порождающий убийство процесса.

Специфика macOS

В macOS системный вызов kill в ядре XNU вызывает функцию psignal(SIGKILL. ). Попробуем посмотреть, какие еще действия пользователя в userspace может вызвать функцию psignal. Отсеим вызовы функции psignal в внутренних механизмах ядра (хотя и они могут быть нетривиальными, но оставим их для другой статьи :) — проверка подписи, ошибки памяти, обработка exit/terminate, нарушение защиты файлов и т.п.

launchd

Стандартный способ создания демонов на запуске системы и контролировать их время жизни — launchd. Обращу внимание на то, что исходники приведены для старой версии launchctl до macOS 10.10, примеры кода приведены в качестве иллюстрации. Современный launchctl отправляет сигналы launchd через XPC, логика launchctl перенесена в него.

Рассмотрим как именно производится остановка приложений. Перед отправкой сигнала SIGTERM, приложение пытаются остановить при помощи системного вызова “proc_terminate”.


Под капотом proc_terminate, несмотря на свое название, может отправлять не только psignal c SIGTERM, но и SIGKILL.

Косвенное убийство — ограничение на ресурсы

Более интересный случай можно увидеть в другом системном вызове process_policy. Стандартное использование этого системного вызова — ограничения ресурсов приложений, например для индексера ограничение на квоту процессорного времени и памяти, чтобы система не существенно замедлялась от действий кэширования файла. Если приложение достигло ограничения на ресурсы, как можно увидеть из функции proc_apply_resource_actions, то процессу отправляется сигнал SIGKILL.

Несмотря на то, что данный системный вызов может потенциально производить убийство процесса, система не проверяла адекватно права процесса, вызывающего системный вызов. На самом деле проверка существовала, но достаточно использовать альтернативный флаг PROC_POLICY_ACTION_SET для обхода этого условия.

Отсюда если “ограничить” квоту использования CPU приложением (например разрешить выполняться только 1 ns),, то можно произвести убийство любого процесса в системе. Так, зловред может убить любой процесс на системе, в том числе и процесс антивируса. Также интересен эффект, который получается при убийстве процесса с pid 1 (launchctl) — kernel panic при попытке обработать сигнал SIGKILL :)

image

Как решать проблему?

Самый прямолинейный способ запретить убивать процесс — подменить указатель на функцию в таблице системных вызовов. К сожалению, данный способ является нетривиальным по многим причинам

Во-первых, символ, который отвечает за положение sysent в памяти, не только является приватным символа ядра XNU, но и не может быть найден в символах ядра. Придется использовать эвристические методы поиска, например динамическое дизассемблирование функции и поиск указателя в ней.

Во-вторых, структура записей в таблице зависит от флагов, с которыми было собрано ядро. Если объявлен флаг CONFIG_REQUIRES_U32_MUNGING, то размер структуры будет изменен — добавлено дополнительное поле sy_arg_munge32. Необходимо производить дополнительную проверку на то, с каким флагом было скомпилировано ядро, как вариант сверять указатели на функции с известными.


К счастью, в современных версиях macOS Apple предоставляет новое API для работы с процессами. Endpoint Security API позволяет клиентами авторизировать многие запросы к другим процессам. Так, можно заблокировать любые сигналы к процессы, в том числе сигнал SIGKILL при помощи вышеупомянутого API.


Аналогично в ядре можно зарегистрировать MAC Policy, который предоставляет метод защиты от сигналов (policy proc_check_signal), однако API не поддерживается официально.

Защита расширения ядра

Для обнаружения количества экземпляров классов в системе существует утилита ioclasscount.


Любое расширение ядра, которое желает зарегистрироваться в стеке драйверов, обязано объявить класс, унаследованный от IOService, например, my_kext_ioservice в данном случае.Подключение пользовательских приложений вызывает создание нового экземпляра класса, который наследуется от IOUserClient, в примере my_kext_iouserclient.

При попытке выгрузки драйвера из системы (команда kextunload) вызывается виртуальная функция “bool terminate(IOOptionBits options)”. Достаточно вернуть false на вызове функции terminate при попытке выгрузки, чтобы запретить kextunload.


Флаг IsUnloadAllowed может быть выставлен IOUserClient при загрузке. При ограничении на загрузку команда kextunload вернет следующий вывод:


Аналогичную защиту необходимо произвести и для IOUserClient. Экземпляры классов можно выгрузить при помощи userspace функции IOKitLib “IOCatalogueTerminate(mach_port_t, uint32_t flag, io_name_t description);”. Можно возвращать false на вызове команды “terminate” пока userspace приложение не “умрет”, то есть не будет вызов функции “clientDied”.

Защита файлов

Для защиты файлов достаточно использовать Kauth API, который позволяет ограничивать доступ к файлам. Apple предоставляет разработчикам нотификации о различных событиях в scope, для нас важны операции KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA и KAUTH_VNODE_DELETE_CHILD. Ограничивать доступ к файлам проще всего по пути — используем API “vn_getpath” для получения пути к файлу и производим сравнение префикса пути. Заметим, что для оптимизации переименования путей папок с файлами, система не авторизирует доступ к каждому файлу, но только к самой папке, которую переименовали. Необходимо производить сравнение родительского пути и ограничивать KAUTH_VNODE_DELETE для нее.

image

Недостатком данного подхода может стать низкая производительность при возрастании количества префиксов. Для того, чтобы сравнение не было равно O(prefix*length), где prefix — количество префиксов, length — длина строки, можно использовать детерминированный конечный автомат (ДКА), построенный по префиксам.

Рассмотрим способ построения ДКА для данного набора префиксов. Инициализируем курсоры на начало каждого префикса. Если все курсоры указывают на один и тот же символ, то увеличим каждый курсор на один символ и запомним, что длина одинаковой строчки больше на единицу. Если существует два курсора, символы под которыми разные, разделим курсоры на группы по символу, на которые они указывают и повторим алгоритм для каждой группы.

В первом случае (все символы под курсорами одинаковые) получаем состояние ДКА, которое имеет только один переход по одинаковой строчке. Во втором случае, получаем таблицу переходов размером 256 (кол-во символов и максимальное количество групп) в последующие состояния, полученные при рекурсивном вызове функции.

Рассмотрим пример. Для набора префиксов (“/foo/bar/tmp/”, “/var/db/foo/”, “/foo/bar/aba/”, “foo/bar/aac/”) можно получить следующий ДКА. На рисунке указаны только переходы, ведущие в другие состояния, другие переходы не будут являться конечными.

image

При прохождении по состояниям ДКА может оказаться 3 случая.

  1. Было достигнуто финальное состояние — путь является защищенным, ограничиваем операции KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA и KAUTH_VNODE_DELETE_CHILD
  2. Не было достигнуто финальное состояние, но путь “кончился” (был достигнут ноль-терминатор) — путь является родительским, необходимо ограничивать KAUTH_VNODE_DELETE. Заметим, что если vnode является папкой, нужно добавить в конец ‘/’, в противном случае может производиться ограничение к файлу “/foor/bar/t”, что неверно.
  3. Не было достигнуто финальное состояние, путь не кончился. Ни один из префиксов не соответствует данном, не вводим ограничения.

Заключение

image

Все это можно сделать только в том случае, если ваша утилита была официально установлена в ядро. То есть для внешнего и нежелательного ПО нет таких лазеек. Однако, как вы видите, даже для защиты легитимных программ, таких как антивирус и система резервного копирования, приходится потрудиться. Но зато теперь новые продукты Acronis для macOS будут иметь дополнительную защиту от выгрузки из системы.

В случае подвисания какого-нибудь приложения на Mac необходимо принудительно его завершить. Это поможет быстро закрыть программу или перезагрузить её, позволив избежать перезагрузки всей системы macOS. В данном материале мы расскажем о всех основных способах принудительного завершения приложений и фоновых процессов на Mac.

Как принудительно перезагрузить MacBook (Pro, Air), iMac или Mac mini

Существует три основных способа принудительного завершения приложений на Mac:

«Завершить принудительно…»

Самый простой способ быстро закрыть приложение — пройти в меню  и нажать пункт «Завершить принудительно…». Это меню быстро открывается сочетанием клавиш ⌘Cmd + ⌥Option (Alt) + Esc.

«Завершить принудительно…» для Mac

Далее останется выбрать необходимую игру или программу и нажать кнопку «Завершить».

«Завершить принудительно…» для Mac

Главный недостаток способа заключается в том, что при помощи этой системной утилиты нельзя закрывать фоновые процессы, которых в macOS очень и очень много.

В некоторых случаях вызвать пункт «Завершить принудительно» можно правой кнопкой мыши по иконке приложения в Доке.

Мониторинг системы

Куда более интересным способом является использование системной утилиты «Мониторинг системы». Открыть её можно перейдя в Finder → Программы → и, или же просто введя в поиск Spotlight соответствующий запрос.

Мониторинг системы

Закрыть приложение или процесс очень просто — достаточно выделить нужную строчку и нажать кнопку с изображением крестика в левом верхнем углу.

В появившемся диалоговом окне останется выбрать способ закрытия — обычный (сохраняются все данные и приложение закрывается штатно) или принудительный, который подойдёт для подвисших приложений.

Мониторинг системы

Главное преимущество утилиты «Мониторинг системы» в том, что тут отображаются не только активные игры и программы, но и системные процессы, фоновые задачи и даже приложения, запущенные на других учётных записях этого Mac (разумеется, поддерживается и управление этими процессами из учётной записи администратора без ввода пароля от второстепенной учётной записи).

Терминал

Более сложный для рядовых пользователей Mac способ, но от этого не менее эффективный. Любой программист сможет при помощи Терминала закрыть процесс или задачу в разы быстрее.

1. Откройте Терминал (Finder → Программы → Утилиты или через поиск Spotlight).

Читайте также: