What is a Zombie Process?
Before we get started I wanted to first cover what exactly a Zombie process is.
Linux and Unix both have the ability for a process to create a sub process otherwise known as a “Child Process”. Once a process creates a new sub process the first process then becomes a “Parent Process” as it has spawned a child process during its execution.
A Zombie or defunct process is a process that has finished its execution and is waiting for its Parent Process to read its exit status. Because the child process has finished, it is technically a “dead” process however since it is waiting for its parent there is still an entry in the process table. The zombie’s parent process does not necessarily need to be running for a zombie to appear, however it is most common to see a zombie process whose parent has died unexpectedly.
How to spot a Zombie Process
Zombie processes can be found easily with the ps command. Within the ps output there is a column which will show the processes current status, a zombie process will have as the status. In addition to the column zombies commonly have the words in the column as well.
Example:
3 ответа
Лучший ответ
Зомби-процессы полезны.
Зомби-процессы позволяют родителю быть уверенным в том, что он сможет получить статус выхода, учетную информацию и идентификатор процесса дочерних процессов.
Процесс, который не убирает своих дочерних зомби, неправильно запрограммирован.
-3
Toby Speight
2 Авг 2017 в 08:08
Ответ также есть в Википедии:
6
Adam B
4 Мар 2016 в 18:55
Зомби-процессы действительно важны и, безусловно, должны существовать
Во-первых, важно понять, как создание процесса работает в Unix / Linux. Единственный способ создать новый процесс — это создать для существующего процесса новый дочерний процесс через
Таким образом, все процессы в системе организованы в красивую упорядоченную древовидную иерархию. Попробуйте запустить в системе Linux, чтобы увидеть иерархию процессов, которыми вы владеете.
Во многих программах для родительского процесса критически важно иметь возможность получить основную информацию о своих дочерних процессах, которые завершились. Эта основная информация включает статус выхода и использование ресурсов дочерним элементом
Когда родитель готов получить информацию о мертвом дочернем процессе, он вызывает одну из функций , чтобы дождаться завершения дочернего процесса и получить информацию о статусе выхода и использовании ресурсов.
Но что произойдет, если дочерний процесс завершится раньше, чем его дождется родитель? Здесь необходимы зомби-процессы . Операционная система не может просто отбросить дочерний процесс; работа родительского процесса может зависеть от знания статуса выхода или использования ресурсов дочерним процессом. т.е. родительскому процессу может потребоваться знать, что дочерний процесс завершился ненормально, или он мог бы собирать статистику использования ЦП для своих дочерних процессов и т. д. Таким образом, единственный выбор — сохранить эту информацию и сделать ее доступной для родителя, когда он, наконец, позвоните
Эта информация представляет собой зомби-процесс и является важной частью того, как управление процессами работает в Unix / Linux. Процессы-зомби позволяют родителю гарантированно получить статус выхода, учетную информацию и идентификатор процесса для дочерних процессов, независимо от того, вызывает ли родитель до или после выхода дочернего процесса
em>
Вот почему необходим процесс зомби.
Сноска: Если родительский процесс никогда не вызывает , тогда дочерний процесс переходит на процесс , когда родительский процесс умирает, и будет для дочернего процесса.
17
mshildt
11 Июн 2013 в 17:50
Первая линия обороны – антивирус
Превращение компьютера в «зомби» связано с инфицированием вредоносной программой. Поэтому сначала просканируйте компьютер антивирусом. Он должен быть обновлен, а сканирование должно охватить весь компьютер, а не только системные файлы и профиль пользователя.
Если антивирус обнаруживает вредителей, необходимо проверить, связаны ли они с работой бот-сети или являются обычными компьютерными вирусами, которые необходимо удалить. Мы рекомендуем связаться со службой поддержки вашего антивируса, почитать интернет-форумы, посвященные безопасности, а также провести сбор информации о паразите.
Сканирование компьютера с помощью антивирусной системы – это половина успеха. Часть вредоносных программ, ответственных за превращение компьютера в зомби, может быть скрыта с помощью руткитов.
Чтобы выявить наличие такого программного обеспечения, вы должны проверить ваш компьютер с помощью опции «Сканирование на руткиты».
Are Zombie Processes Dangerous?
Zombie processes use a little bit of memory, but usually, they don’t pose a danger. The process table entry is small, but you can’t use its process ID until the zombie process is released. On a 64-bit OS, it’s not going to create a problem because the PCB is larger than the entry of the process table.
A huge number of zombie processes could affect the free memory available for other processes. If you face too many zombies, there’s some serious issue with the operating system bug or the parent application. In that case, the remaining process IDs get monopolized by the zombies. If there remain no process IDs, other processes are unable to run.
Другие способы убить программу
Есть еще 5 способов убить приложение Linux, как указано в связанном руководстве.
Однако, чтобы спасти вас от усилий, щелкнув ссылку здесь, это раздел, показывающий, что это за команды, поэтому вы можете использовать эти команды над killall.
Первая из них — команда kill. Команда killall, как вы видели, отлично умеет убивать все версии одной и той же программы. Команда kill предназначена для того, чтобы убивать один процесс за раз и, следовательно, больше нацелена.
Чтобы запустить команду kill, вам нужно знать идентификатор процесса, который вы хотите убить. Для этого вы можете использовать команду ps.
Например, чтобы найти запущенную версию Firefox, вы можете запустить следующую команду:
В конце вы увидите строку данных с командой / usr / lib / firefox / firefox. В начале строки вы увидите свой идентификатор пользователя и номер после идентификатора пользователя ID процесса.
Используя идентификатор процесса, вы можете убить Firefox, выполнив следующую команду:
Другой способ убить программу — это использовать команду xkill. Обычно это используется для того, чтобы убивать неправильные графические приложения.
Чтобы убить такую программу, как Firefox, откройте терминал и выполните следующую команду:
Теперь курсор изменится на большой белый крест. Наведите курсор на окно, которое вы хотите убить, и щелкните левой кнопкой мыши. Программа выйдет немедленно.
Другой способ убить процесс — это использовать верхнюю команду Linux. В верхней команде перечислены все запущенные процессы в вашей системе.
Все, что вам нужно сделать, чтобы убить процесс, это нажать клавишу «k» и ввести идентификатор процесса приложения, которое вы хотите убить.
Ранее в этом разделе команда kill, и вам потребовалось найти процесс, используя команду ps, а затем убить процесс, используя команду kill. Это не самый простой вариант.
С одной стороны, команда ps возвращает массу ненужной информации. Все, что вам нужно, это идентификатор процесса. Вы можете получить идентификатор процесса более просто, выполнив следующую команду:
Результатом вышеуказанной команды является просто идентификатор процесса Firefox. Теперь вы можете запустить команду kill следующим образом:
(Заменить с фактическим идентификатором процесса, возвращаемым pgrep).
Однако на самом деле проще просто указать имя программы для pkill следующим образом:
Наконец, вы можете использовать графический инструмент, такой как тот, который поставляется с Ubuntu под названием «Системный монитор». Для запуска «Системного монитора» нажмите клавишу супер (ключ Windows на большинстве компьютеров) и введите «sysmon» в панель поиска. Когда появится значок системного монитора, щелкните по нему.
Системный монитор отображает список процессов. Чтобы закончить программу чистым способом, выберите ее и нажмите клавишу завершения в нижней части экрана (или нажмите CTRL и E). Если это не сработает, щелкните правой кнопкой мыши и выберите «Убить» или нажмите CTRL и K в процессе, который вы хотите убить.
Zombi не запускается. Ошибка при запуске. Решение
Zombi установилась, но попросту отказывается работать. Как быть?
Выдает ли Zombi какую-нибудь ошибку после вылета? Если да, то какой у нее текст? Возможно, она не поддерживает вашу видеокарту или какое-то другое оборудование? Или ей не хватает оперативной памяти?
Помните, что разработчики сами заинтересованы в том, чтобы встроить в игры систему описания ошибки при сбое. Им это нужно, чтобы понять, почему их проект не запускается при тестировании.
Обязательно запишите текст ошибки. Если вы не владеете иностранным языком, то обратитесь на официальный форум разработчиков Zombi. Также будет полезно заглянуть в крупные игровые сообщества и, конечно, в наш FAQ.
Если Zombi не запускается, мы рекомендуем вам попробовать отключить ваш антивирус или поставить игру в исключения антивируса, а также еще раз проверить соответствие системным требованиям и если что-то из вашей сборки не соответствует, то по возможности улучшить свой ПК, докупив более мощные комплектующие.
Уничтожение процесса-зомби
Во-первых, давайте поймем, как процессы-зомби являются угрозой производительности нашей системы
Важно узнать, что зомби являются мертвыми и главным образом завершенными процессами, которые не берут ресурсы ЦП или память. Однако каждый из этих процессов имеет уникальный идентификатор процесса, присвоенный им, который прибывает из ограниченного пула PIDs, зарезервированного для Вашего процессора
Если большое количество зомби соберется, они съедят большую часть части пула PID, и новые процессы не будут в состоянии запуститься из-за отсутствия идентификатора процесса.
Небольшое количество более не существующих программ, занимающих Вашу систему, не является большой угрозой, но это означает, что их родительские программы не были в состоянии отозвать их из-за ошибки или недостающего ожидания () функция.
Когда родительский процесс не был в состоянии назвать ожидание () функцией автоматически, мы должны вручную предупредить, чтобы родительский процесс выполнил функцию ожидания на всех своих детях, таким образом, те с полным состоянием могут быть призваны обратно. Мы можем сделать это путем выполнения команды SIGCHLD. Когда это не работает, мы можем вручную уничтожить родительский процесс так, чтобы все его дети зомби были также уничтожены, освободив идентификаторы процесса для новых процессов.
Можно уничтожить процессы-зомби через следующие пути:
- Через графический интерфейс пользователя
- Через командную строку
Через GUI
Можно уничтожить процесс-зомби графически через Утилиту Системного монитора следующим образом:
- Откройте утилиту System Monitor через Тире Ubuntu.
- Ищите термин Зомби через Кнопку поиска.
- Выберите процесс-зомби, щелкните правой кнопкой и затем избранное Уничтожение из меню.
Процесс-зомби будет уничтожен от Вашей системы.
Через командную строку
После того, как Вы будете знать, что там любые процессы-зомби, работающие на Вашей системе посредством главной команды, посмотрите детали процессов.
Обычный путь состоит в том, чтобы использовать следующую команду, которая сигнализирует, чтобы родительский процесс зомби уничтожил команду.
$ kill -s SIGCHLD PID
Эта команда не может работать в нескольких случаях не, все родительские процессы программируются правильно в проверке порядка после дочерних процессов. В этом случае можно уничтожить родительский процесс посредством следующей команды:
$ sudo kill -9 3376
Когда Вы уничтожили все процессы-зомби через этот путь и выполнили главную команду, Вы будете в состоянии видеть, что нет никаких процессов-зомби, работающих на Вашей системе больше:
После работы наряду с этим учебным руководством можно оптимизировать операционную систему путем поиска любых процессов-зомби в системе и уничтожения их вручную через командную строку или графический интерфейс пользователя. Это действие освободит идентификаторы процесса для новых процессов, что Вы хотите работать на своей системе.
Viewing Zombie Processes
You can check your system’s performance by looking at the various processes running on your system, including efficiency-altering zombie processes. Ubuntu allows you to view these processes in the following way:
- Through the Graphical User Interface
- Through the Command Line
Through the GUI
In order to graphically view any zombie processes running on your system, open the System Monitor utility through your Ubuntu Dash. In the following screenshot of my System Monitor, you can view that there are two zombies running on my system. It is also possible that the number of zombie processes on your system might be less or more than the ones running on mine.
Through the Command Line
The top command displays a detailed view of the processes running on your system along with the memory and CPU resources they are using. It also gives you information about any zombie processes running on your system. Open the Terminal by pressing Ctrl+Alt+T and then type top. I got the following output after running this command.
$ top
You can see in the second line that there is 1 zombie process running on my system.
If you want further details about the zombie process, use the following command:
$ ps axo stat,ppid,pid,comm | grep -w defunct
This command will give you the state, parentID, the process ID, the program that is running the zombie process(a dummy program by the name ‘zombie’ on my system). The defunct flag tells you that this is a dead, zombie process.
How to Kill a Process in Linux
22 Июня 2020
|
Терминал
Сталкивались ли вы с ситуацией, когда вы запускали приложение, и вдруг, когда вы используете приложение, оно перестает отвечать на запросы и неожиданно вылетает? Вы пытаетесь запустить приложение снова, но ничего не происходит, потому что исходный процесс приложения никогда не завершается полностью.
Ну, это случилось со всеми нами в какой-то момент, не так ли? Решение состоит в том, чтобы прекратить или убить процесс приложения. Но как?
К счастью, в Linux есть несколько утилит, которые позволяют убивать ошибочные процессы.
Основное различие между этими инструментами заключается в том, что они завершают процессы на основе идентификатора процесса (PID), а команды и завершают запущенные процессы на основе их имен и других атрибутов.
Обычные пользователи могут уничтожать свои собственные процессы, но не те, которые принадлежат другим пользователям, в то время как пользователь root может уничтожать все процессы.
Сигналы убийства системы
, И послать данный сигнал к определенным процессам или группам процессов. Когда сигнал не указан, каждый инструмент отправляет ( ).
Наиболее часто используемые сигналы:
- (-HUP): перезагрузить процесс.
- (-KILL): убить процесс.
- (-TERM): изящно остановить процесс.
Сигналы могут быть указаны тремя различными способами:
- используя число (например, -1)
- с префиксом «SIG» (например, -SIGHUP)
- без префикса «SIG» (например, -HUP).
Используйте опцию для перечисления всех доступных сигналов:
Описанные ниже шаги будут работать на всех дистрибутивах Linux.
Завершение процессов с помощью команды
Чтобы прервать процесс сначала командой, вам нужно найти PID процесса. Вы можете сделать это , используя различные команды , такие как , , , и .
Допустим, браузер Firefox перестал отвечать на запросы, и вам нужно убить процесс браузера. Чтобы найти идентификатор процесса, используйте команду:
Команда напечатает все процессы Firefox:
Как только вы узнаете, что Firefox обрабатывает PID для завершения, все они посылают сигнал:
Завершение процессов с помощью команды
Команда завершает все программы, которые соответствуют указанному имени.
Используя тот же сценарий, что и раньше, вы можете убить процесс Firefox, набрав:
принимает несколько параметров, таких как отправка сигналов процессам, принадлежащим данному пользователю, сопоставление имен процессов с регулярными выражениями и время создания. Вы можете получить список всех опций, набрав (без каких-либо аргументов) на своем терминале.
Например, чтобы завершить все процессы, запущенные от имени пользователя «sara», вы должны выполнить следующую команду:
Завершение процессов с помощью команды
завершает процессы, которые соответствуют шаблону, указанному в командной строке:
Название процесса не должно быть точным совпадением.
С его помощью вы также можете отправить сигнал процессам, которые принадлежат данному пользователю. Чтобы убить только процессы firefox, принадлежащие пользователю «sara», вы должны набрать:
Завершение работы не отвечающих программ с помощью команд , and — простая задача. Вам нужно только знать имя процесса или PID.
What Causes Zombie Processes on Linux?
To understand the underlying cause of a zombie process in detail, you’ll have to learn how processes start and stop in Linux. The Linux operating system monitors all the running processes and daemons on a computer. The process table is a list of structures that contains all the processes that are currently running on your machine.
Each process entry in the process table consists of a link to the process control block of that specific process. The PCB stores the details associated with that particular process. These details include:
- Process state: The current state of the process
- Process number: A unique number used to identify the process
- Program counter: Contains information related to the next instruction
- Registers: List of all the CPU registers used by the process
- Open file list: Files used by the process
- CPU scheduling information: Contains information associated with the CPU time and resources allocated to the process
- Memory management information: Includes details on the amount of memory used by the process
- I/O information: List of input or output devices utilized by the process
Linux uses the following process states to describe all its processes.
- R: Running process
- S: Sleeping process
- D: Uninterruptable sleeping process
- T: Terminated process
- Z: Zombie process
Whenever a process completes the task assigned, its process state is set as Zombie or Z. Every process has a parent process that calls a family of functions named wait() that waits for the state change of a process. For example, if the process state changes from Running to Zombie, the wait() method will be triggered.
The wait() method usually deletes the process control block related to that zombie process and then removes the entry of that process from the process table.
But sometimes, due to the poor development of a program, the parent process doesn’t call the wait() function. And as a result, the system doesn’t delete the PCB of the zombie process. The process table entry for that specific process remains intact as well.
This grants the zombie process an infinite lifespan. Since the system can’t kill the process, the process entry is never deleted, and the PID never gets freed.
Зомби, которые съедают вашу память +98
- 26.02.18 08:22
•
tangro
•
#349924
•
Хабрахабр
•
Перевод
•
•
29100
Google Chrome, Системное программирование, Блог компании Инфопульс Украина, Отладка, Системы сборки
Что бы вы там себе не думали, а зомби существуют. И они действительно едят мозги. Не человеческие, правда, а компьютерные. Я говорю сейчас о зомби-процессах и потребляемых ими ресурсах. Это будет душераздирающая история о потерянных и снова найденных 32 ГБ оперативной памяти. Возможно, лишь некоторые из вас столкнутся с точно такой же проблемой, но если вдруг это произойдёт — у вас хотя бы будет шанс понять, что происходит.
Начнём с того, что компьютеры под управлением ОС Windows склонны со временем терять память. Ну, по крайней мере, у меня, при моём способе ими пользоваться. После пары недель без перезагрузок (или, например, всего одного уикэнда за который я 300 раз пересобрал Хром) я стал замечать, что диспетчер задач начинает показывать мне очень маленькое количество свободной оперативной памяти, но в то же время в системе нет никаких процессов, которые эту самую память активно используют. В том примере выше (с 300 сборками Хрома) диспетчер задач сказал мне, что в системе занято 49.8 ГБ плюс ещё 4.4 ГБ памяти сжато — но при этом запущено всего несколько процессов, и все они в сумме даже и близко не используют столько памяти:
В моём компьютере 96 ГБ оперативной памяти (да, я счастливчик) и когда у меня нет вообще никаких запущенных процессов — я, знаете ли, хотел бы видеть ну хотя бы половину этой памяти свободной. Я правда рассчитываю на это. Но иногда этого достичь не удаётся и мне приходится перезагружать ОС. Ядро Windows написано качественно и надёжно (без шуток), так что память не должна бы пропадать бесследно. Но всё же она пропадает.
Первой же моей догадкой стало воспоминание о том, что один из моих коллег как-то жаловался на зомби-процессы, которые иногда остаются в ОС уже не активными, но всё же ещё не до конца удалёнными ядром. Он даже написал специальную утилиту, которая выводит список таких процессов — их имена и количество. Когда он запускал эту утилиту в своих тестах, то получал до нескольких сотен зомби-процессов на обычной Windows-машине. Я нашел его инструмент, запустил на своём компьютере и получил… 506 000 зомби-процессов. Да, 506 тысяч!
Я вспомнил, что одной из возможных причин перехода процесса в состояние «зомби» может быть то, что какой-то другой процесс держит открытым его дескриптор (handle). В моём случае большое количество зомби-процессов играло мне на руку — им было сложнее скрыться. Я просто открыл диспетчер задач и добавил на вкладку Details столбец с количеством открытых дескрипторов для каждого процесса. Затем отсортировал список по убыванию значений в этом столбце. Я сразу нашел героя данной истории — процесс CcmExec.exe (часть Microsoft System Management Server) имел 508 000 открытых дескрипторов. Это было во-первых, очень много, а во-вторых, подозрительно близко к найдненному мною выше числу в 506 000 зомби-процессов.
Я убил процесс CcmExec.exe и получил следующий результат:
Всё получилось ровно так, как я того и ожидал. Как я без иронии писал выше — ядро Windows написано очень хорошо и когда процесс уничтожается, то и все занятые им ресурсы освобождаются. Закрытие CcmExec.exe освободило 508 000 дескрипторов, что дало возможность окончательно закрыть 506 000 зомби-процессов. Количество свободной оперативной памяти мгновенно выросло на 32 ГБ. Тайна раскрыта!
Обзор [ править ]
Когда процесс завершается через , вся память и связанные с ним ресурсы освобождаются, чтобы их могли использовать другие процессы. Однако запись процесса в таблице процессов остается. Родитель может прочитать статус выхода ребенка, выполнив системный вызов , после чего зомби будет удален. Вызов может быть выполнен в последовательном коде, но оно обычно выполняется в обработчике для SIGCHLD сигнала , который родитель получает всякий раз , когда умер ребенок.
После удаления зомби его идентификатор процесса (PID) и запись в таблице процессов можно использовать повторно. Однако, если родитель не может позвонить , зомби останется в таблице процессов, что приведет к утечке ресурсов . В некоторых ситуациях это может быть желательно — родительский процесс желает продолжать удерживать этот ресурс — например, если родительский процесс создает другой дочерний процесс, он гарантирует, что ему не будет назначен тот же PID. В современных UNIX-подобных системах (которые соответствуют спецификации SUSv3 в этом отношении) применяется следующий особый случай: если родительский элемент явно игнорирует SIGCHLD, устанавливая для своего обработчика значение (а не просто игнорируя сигнал по умолчанию) или имеетустановлен флаг, вся информация о статусе дочернего выхода будет отброшена, и никаких зомби-процессов не останется.
Зомби может быть идентифицирован на выходе из Unix команды по присутствию « » в колонке «STAT». Зомби, которые существуют более короткого периода времени, обычно указывают на ошибку в родительской программе или просто на необычное решение не пожинать детей (см. Пример). Если родительская программа больше не работает, зомби-процессы обычно указывают на ошибку в операционной системе. Как и в случае с другими утечками ресурсов, присутствие нескольких зомби само по себе не вызывает беспокойства, но может указывать на проблему, которая может стать серьезной при более высоких нагрузках. Поскольку для зомби-процессов не выделяется память — единственная системная память используется для самой записи в таблице процессов — основная проблема многих зомби заключается не в нехватке памяти, а в исчерпании записей в таблице процессов, в частности, идентификаторов процессов.
Чтобы удалить зомби из системы, сигнал SIGCHLD может быть отправлен родителю вручную с помощью команды. Если родительский процесс по-прежнему отказывается пожинать зомби, и если можно было бы завершить родительский процесс, следующим шагом может быть удаление родительского процесса. Когда процесс теряет своего родителя, становится его новым родителем. периодически выполняет системный вызов, чтобы пожинать любых зомби в качестве родителя.