Зомби или неработающий процесс в Linux - это процесс, который был завершен, но его запись все еще остается в таблице процессов из-за отсутствия соответствия между родительским и дочерним процессами. Обычно родительский процесс следит за состоянием своих дочерних процессов с помощью функции wait(). Когда дочерний процесс завершается, функция wait сигнализирует родительскому процессу о полном выходе процесса из памяти. Однако, если родитель не вызывает функцию wait для любого из своих дочерних процессов, дочерний процесс остается в системе в виде мертвого или зомби-процесса. Эти зомби-процессы могут накапливаться в большом количестве в вашей системе и влиять на ее производительность. В таком случае, возможно, вам придется уничтожить этих зомби вручную с помощью способов и команд, описанных в этом руководстве.
Просмотр зомби-процессов
Вы можете проверить производительность вашей системы, просмотрев различные процессы, запущенные в системе, включая зомби-процессы, которые влияют на эффективность. Ubuntu позволяет просматривать эти процессы следующим образом:
- Через графический интерфейс пользователя
- Через командную строку
Через графический интерфейс
Чтобы графически увидеть все зомби-процессы, запущенные в вашей системе, откройте утилиту System Monitor через Ubuntu Dash. На следующем скриншоте моего Системного монитора видно, что в моей системе запущен зомби-процесс. Также возможно, что количество зомби-процессов в вашей системе может быть меньше или больше, чем в моей.
Из командной строки
Команда top отображает подробный вид процессов, запущенных в вашей системе, а также ресурсы памяти и процессора, которые они используют. Она также предоставляет информацию о любых зомби-процессах, запущенных в вашей системе. Откройте Terminal, нажав Ctrl+Alt+T, а затем введите top. Выполнив эту команду, я получил следующие результаты.
1 | top |
Вторая строка показывает, что в моей системе запущен 1 зомби-процесс.
Если вам нужна дополнительная информация о зомби-процессе, используйте следующую команду:
1 | ps axo stat,ppid,pid,comm | grep -w defunct |
Эта команда даст вам состояние, parentID, ID процесса, программу, которая запускает зомби-процесс (фиктивная программа с именем 'zombie' в моей системе). Флаг defunct говорит вам, что это мертвый, зомби-процесс.
Завершение зомби-процесса
Прежде всего, давайте разберемся, как зомби-процессы угрожают производительности нашей системы. Важно знать, что зомби-процессы - это мертвые и в основном завершенные процессы, которые не занимают память или ресурсы процессора. Однако каждому из этих процессов присвоен уникальный идентификатор процесса, который берется из ограниченного пула PID, зарезервированного для вашего процессора. Если соберется большое количество зомби, они съедят большую часть пула PID, и новые процессы не смогут запуститься из-за отсутствия идентификатора процесса.
Небольшое количество неработающих программ, занимающих вашу систему, не представляет большой угрозы, но это означает, что их родительские программы не смогли их отозвать из-за ошибки или отсутствия функции wait().
Когда родительский процесс не смог вызвать функцию wait() автоматически, нам нужно вручную подать сигнал родительскому процессу на выполнение функции wait на всех его дочерних процессах, чтобы те, у которых состояние завершено, могли быть отозваны. Мы можем сделать это, выполнив команду SIGCHLD. Если это не сработает, мы можем вручную убить родительский процесс, чтобы все его зомбированные дочерние процессы также были убиты, освободив идентификаторы процессов для новых процессов.
Вы можете завершить зомби-процессы следующими способами:
- Через графический интерфейс пользователя
- Через командную строку
Через графический интерфейс пользователя
Вы можете убить зомби-процесс графически через утилиту Системный монитор следующим образом:
- Откройте утилиту Системный монитор через Ubuntu Dash.
- Найдите термин Zombie с помощью кнопки Search.
- Выберите зомби-процесс, щелкните правой кнопкой мыши и выберите в меню команду Kill.
Зомби-процесс будет удален из вашей системы.
Через командную строку
После того как вы узнаете, что в вашей системе запущены какие-либо зомби-процессы, выполните команду top. Вот как просмотреть подробную информацию о процессах.
Обычный способ заключается в использовании следующей команды, которая сигнализирует родительскому процессу зомби убить команду.
1 | kill -s SIGCHLD PID |
Эта команда может не сработать в некоторых случаях, так как не все родительские процессы запрограммированы должным образом, чтобы проверять дочерние процессы. В этом случае вы можете убить родительский процесс с помощью следующей команды:
1 | sudo kill -9 28765 |
Когда вы убьете все зомби-процессы таким образом и выполните команду ps, вы увидите, что в вашей системе больше нет зомби-процессов:
Поработав с этим руководством, вы сможете оптимизировать свою операционную систему, найдя все зомби-процессы в системе и убив их вручную через командную строку или графический интерфейс пользователя. Это действие освободит идентификаторы процессов для новых процессов, которые вы хотите запустить в своей системе.