- Выполняю установку, настройку, сопровождение серверов. Для уточнения деталей используйте форму обратной связи
- 3.4.3. Процессы-зомби
- Читайте также
- Процессы
- Процессы в MI
- Процессы
- Процессы
- 1.6 Процессы
- 12.3.3.4 Фиктивные процессы
- 3.4. Процессы
- 5 Процессы
- Зомби? Нет – перерождение
- 1.6 Процессы
- 3.1.3. Взаимодействующие процессы
- 7.2.5. Подчиненные процессы
- Глава 3 Процессы
- Что такое «процесс зомби» в Linux?
- Что такое процесс зомби?
- Опасности зомби-процессов
- Избавляемся от зомби-процессов
- Зомби процессы в Linux
- Как посмотреть зомби в операционной системе Linux
Выполняю установку, настройку, сопровождение серверов. Для уточнения деталей используйте форму обратной связи
Что же это такое?
Это дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения. Процесс при завершении освобождает все свои ресурсы (за исключением PID — идентификатора процесса) и становится «зомби» — пустой записью в таблице процессов, хранящей код завершения для родительского процесса.
Система уведомляет родительский процесс о завершении дочернего с помощью сигнала SIGCHLD. Предполагается, что после получения SIGCHLD он считает код возврата с помощью системного вызова wait(), после чего запись зомби будет удалена из списка процессов. Если родительский процесс игнорирует SIGCHLD (а он игнорируется по умолчанию), то зомби остаются до его завершения.
А теперь возникают вопросы: как же всё-таки их найти и убить? Найти их очень просто. Вот несколько вариантов:
1)
top | grep zombie
225 processes: 1 running, 222 sleeping, 2 zombie
2)
ps aux | grep -w Z
root 3994 0,0 0,0 0 0 ?? Z 13июн11 16:23,02
root 3995 0,0 0,0 0 0 ?? Z 13июн11 13:43,28
3)
ps -alx | awk ‘$10
Что касается «убийства», то их нельзя просто так убить. Самый правильный вариант — найти родительский процесс и перезапустить его. Некоторые могут посоветовать и перегрузиться, но это не выход.
Находим родительский процесс:
ps ajx | grep -w Z
root 3994 3992 3992 3992 0 Z ?? 16:23,02
root 3995 3992 3992 3992 0 Z ?? 13:43,28
3-я колонка как раз и показывает pid родительского процесса. Смотрим, что это за процесс:
ps auxww | grep 3992
root 3992 0,0 0,2 30664 9872 ?? Ss 13июн11 0:08,21 [exilog_agent] (perl5.12.3)
Собственно мы нашли виновника. Это exilog_agent. А дальше — либо просто прибиваем родительский процесс либо перезапускаем его:
#kill -9 3992
#top | grep zombie
#
Источник
3.4.3. Процессы-зомби
Если дочерний процесс завершается в то время, когда родительский процесс заблокирован функцией wait(), он успешно удаляется и его код завершения передается предку через функцию wait(). Но что произойдет, если потомок завершился, а родительский процесс так и не вызвал функцию wait()? Дочерний процесс просто исчезнет? Нет, ведь в этом случае информация о его завершении (было ли оно аварийным или нет и каков код завершения) пропадет. Вместо этого дочерний процесс становится процессом-зомби.
Зомби — это процесс, который завершился, но не был удален. Удаление зомби возлагается на родительский процесс. Функция wait() тоже это делает, поэтому перед ее вызовом не нужно проверять, продолжает ли выполняться требуемый дочерний процесс. Предположим, к примеру, что программа создает дочерний процесс, выполняет нужные вычисления и затем вызывает функцию wait(). Если к тому времени дочерний процесс еще не завершился, функция wait() заблокирует программу. В противном случае процесс на некоторое время превратится в зомби. Тогда функция wait() извлечет код его завершения, система удалит процесс и функция немедленно завершится.
Что же всё-таки случится, если родительский процесс не удалит своих потомков? Они останутся в системе в виде зомби. Программа, показанная в листинге 3.6, порождает дочерний процесс, который немедленно завершается, тогда как родительский процесс берет минутную паузу, после чего тоже заканчивает работу, так и не позаботившись об удалении потомка.
Листинг 3.6. (zombie.c) Создание процесса-зомби
/* Создание дочернего процесса. */
if (child_pid > 0) <
/* Это родительский процесс — делаем минутную паузу. */
/* Это дочерний процесс — немедленно завершаем работу. */
Скомпилируйте этот файл и запустите программу. Пока программа работает, перейдите в другое окно и просмотрите список процессов с помощью следующей команды:
% ps -е -o pid,ppid,stat,cmd
Эта команда отображает идентификатор самого процесса и его предка, а также статус процесса и его командную строку. Обратите внимание на присутствие двух процессов с именем zombie. Один из них — предок, другой — потомок. У последнего идентификатор родительского процесса равен идентификатору основного процесса zombie, при этом потомок обозначен как (несуществующий), а его код состояния равен Z (т.е. zombie — зомби).
Итак, мы хотим узнать, что будет, когда программа zombie завершится, не вызвав функцию wait(). Останется ли процесс-зомби? Нет — выполните команду ps и убедитесь в этом: оба процесса zombie исчезли. Дело в том, что после завершения программы управление ее дочерними процессами принимает на себя специальный процесс — демон init, который всегда работает, имея идентификатор 1 (это первый процесс, запускаемый при загрузке Linux). Демон init автоматически удаляет все унаследованные им дочерние процессы-зомби.
Читайте также
Процессы
Процессы Создание параллельных процессов настолько полно описано в литературе по UNIX, что здесь мы приведем лишь минимально необходимый беглый обзор, останавливаясь только на отличительных особенностях ОС QNX.Всякое рассмотрение предполагает наличие системы понятий.
Процессы в MI
Процессы в MI Процесс в MI — это системный объект, называемый пространством управления процессом. Обратите внимание, что эквивалентного объекта OS/400 нет. (Мы еще поговорим об этом в разделах, посвященных управлению работами). Задача процесса в MI — связать воедино ресурсы,
Процессы
Процессы Процессы в операционной системе UNIX играют ключевую роль. От оптимальной настройки подсистемы управления процессами и числа одновременно выполняющихся процессов зависит загрузка ресурсов процессора, что в свою очередь имеет непосредственное влияние на
Процессы
Процессы В главе 1 уже упоминались процессы. Однако знакомство ограничивалось пользовательским, или командным интерфейсом операционной системы. В этом разделе попробуем взглянуть на них с точки зрения программиста.Процессы являются основным двигателем операционной
1.6 Процессы
1.6 Процессы Наряду с файлом, понятие процесса является важнейшим в концепции открытых операционных систем.Процесс – это обладающая уникальным идентификатором единица исполняемого кода35 в памяти.Подавая простую команду из оболочки, оператор дает ОС указание запустить
12.3.3.4 Фиктивные процессы
12.3.3.4 Фиктивные процессы Когда ядро выполняет переключение контекста в однопроцессорной системе, оно функционирует в контексте процесса, уступающего управление (см. главу 6). Если в системе нет процессов, готовых к запуску, ядро переходит в состояние простоя в контексте
3.4. Процессы
3.4. Процессы Для того чтобы эффективно управлять своим компьютером, вы должны досконально изучить свой сервер и работающие на нем процессы. Взломав ваш сервер, злоумышленник постарается запустить на нем какую-либо программу, которая незаметно будет выдавать хакеру права
5 Процессы
5 Процессы 5.1. Системные вызовы fork() и ехес() Процесс в Linux (как и в UNIX) — это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, под него автоматически создается процесс, в котором выполняется оболочка
Зомби? Нет – перерождение
Зомби? Нет – перерождение После того как домен удален из реестра доменных имен, регистрация такого же домена оказывается доступна любому другому лицу; в стандартных случаях у прежнего администратора нет никаких приоритетов. Правда, подобные приоритеты могут возникнуть
1.6 Процессы
1.6 Процессы Наряду с файлом, понятие процесса является важнейшим в концепции открытых операционных систем.Процесс — это обладающая уникальным идентификатором единица исполняемого кода[35] в памяти.Подавая простую команду из оболочки, оператор дает ОС указание запустить
3.1.3. Взаимодействующие процессы
3.1.3. Взаимодействующие процессы В случае Unix малозатратное создание дочерних процессов (Process-Spawning) и простое межпроцессное взаимодействие (Inter-Process Communication — IPC) делают возможным использование целой системы небольших инструментов, каналов и фильтров. Данная система будет
7.2.5. Подчиненные процессы
7.2.5. Подчиненные процессы Иногда дочерние программы интерактивно принимают и возвращают данные вызвавшим их программам через каналы, связанные со стандартным выводом и вводом. В отличие от простых вызовов с созданием подоболочки и конструкций, которые выше были названы
Глава 3 Процессы
Глава 3 Процессы Выполняющийся экземпляр программы называется процессом. Если на экране отображаются два терминальных окна, то, скорее всего, одна и та же терминальная программа запущена дважды — ей просто соответствуют два процесса. В каждом окне, очевидно, работает
Источник
Что такое «процесс зомби» в Linux?
Если вы пользователь Linux, вы, возможно, видели процессы зомби, шатающиеся по списку процессов. Вы не можете убить процесс зомби, потому что он уже мертв — как настоящий зомби.
Зомби — это остатки мертвых процессов, которые не были очищены должным образом. Программа, которая создает процессы зомби, не запрограммирована должным образом — программы не должны позволять процессам зомби оставаться на месте.
Что такое процесс зомби?
Чтобы понять, что такое зомби-процесс и что вызывает появление зомби-процессов, вам необходимо немного понять, как эти процессы работают в Linux.
Когда процесс умирает в Linux, он не все сразу удаляется из памяти — его дескриптор процесса остается в памяти (дескриптор процесса занимает только небольшое количество памяти). Статус процесса становится EXIT_ZOMBIE, и родительский процесс уведомляется о том, что его дочерний процесс умер с сигналом SIGCHLD. Затем предполагается, что родительский процесс выполняет системный вызов wait (), чтобы прочитать состояние завершения мертвого процесса и другую информацию. Это позволяет родительскому процессу получать информацию из мертвого процесса. После вызова wait () процесс зомби полностью удаляется из памяти.
Обычно это происходит очень быстро, поэтому вы не увидите, как зомби-процессы накапливаются в вашей системе. Однако, если родительский процесс не запрограммирован должным образом и никогда не вызывает wait (), его дочерние элементы-зомби останутся в памяти, пока не будут очищены.
Такие утилиты, как GNOME System Monitor, команда top и команда ps, отображают процессы зомби.
Опасности зомби-процессов
Зомби-процессы не используют никаких системных ресурсов. (На самом деле каждый использует очень маленький объем системной памяти для хранения своего дескриптора процесса.) Однако каждый процесс-зомби сохраняет свой идентификатор процесса (PID). Системы Linux имеют конечное число идентификаторов процессов — 32767 по умолчанию в 32-разрядных системах. Если зомби накапливаются с очень высокой скоростью — например, если неправильно запрограммированное серверное программное обеспечение создает процессы зомби под нагрузкой — весь пул доступных PID в конечном итоге будет назначен процессам зомби, предотвращая запуск других процессов.
Тем не менее, некоторые процессы, связанные с зомби, не являются проблемой — хотя они указывают на ошибку с родительским процессом в вашей системе.
Избавляемся от зомби-процессов
Вы не можете убить процессы зомби, как вы можете убить нормальные процессы с помощью сигнала SIGKILL — процессы зомби уже мертвы. Имейте в виду, что вам не нужно избавляться от процессов зомби, если в вашей системе нет большого количества — несколько зомби безвредны. Однако есть несколько способов избавиться от зомби-процессов.
Одним из способов является отправка сигнала SIGCHLD родительскому процессу. Этот сигнал говорит родительскому процессу выполнить системный вызов wait () и очистить его дочерних элементов-зомби. Отправьте сигнал командой kill , заменив pid в приведенной ниже команде на PID родительского процесса:
Однако, если родительский процесс не запрограммирован должным образом и игнорирует сигналы SIGCHLD, это не поможет. Вам придется убить или закрыть родительский процесс зомби. Когда процесс, который создал зомби, заканчивается, init наследует процессы зомби и становится их новым родителем. (init является первым процессом, запущенным в Linux при загрузке, и ему назначается PID 1.) init периодически выполняет системный вызов wait (), чтобы очистить своих потомков-зомби, поэтому init будет быстро справляться с зомби. Вы можете перезапустить родительский процесс после его закрытия.
Если родительский процесс продолжает создавать зомби, его следует исправить, чтобы он правильно вызывал wait (), чтобы пожинать своих потомков-зомби. Подайте отчет об ошибке, если программа в вашей системе продолжает создавать зомби.
Источник
Зомби процессы в Linux
Пользователи устройств, функционирующих на операционной системе Linux, часто сталкиваются с таким распространенным явлением, как зомби процессы. На слух это название звучит весьма устрашающе, и с этим трудно поспорить, но на практике его бояться не стоит. Зомби процессы не способны нанести серьезный удар системе, хотя многие пользователи стараются удалять их во избежание каких-либо непредсказуемых проблем. Чтобы лучше понимать ситуацию, необходимо детальнее разобраться с тем, каким образом стандартный процесс превращается в зомби.
Функция fork запускает дочерний процесс, который попадает под контроль родительского процесса. Если родительский процесс получает сигнал о завершении дочернего процесса, но при этом игнорирует его (в возможные причины сбоя вдаваться не станем), то этот процесс становится зомби.
Стоит ли обращать на них своё внимание? Ответ: делать это совершенно не обязательно. Так как процесс уже был завершен, он перестал использовать системные ресурсы, но остался в системе. Самое разумное в этом случае – сделать вид, что его не существует, и продолжать работать с устройством, как ни в чем не бывало. Если пользователь попытается «уничтожить» зомби при помощи специальной команды «kill», у него ничего не выйдет, ведь этот процесс не выполняется. Это действие является бессмысленным, а потому процесс продолжит отображаться в системе.
Чтобы полностью убрать зомби, необходимо уничтожить или перезапустить его родительский процесс. Если есть такое желание, обратитесь к инструкции ниже.
Как посмотреть зомби в операционной системе Linux
Это можно сделать при помощи утилиты ps:
$ ps aux | grep defunct
Как обнаружить в системе «родителя»:
$ ps -xal | grep defunct
После того, как нашли родителя можно удалить зомби. Это единственный способ уничтожения зомби процесса. Прямые команды не удалят их. Найдите в колонке идентификатор «родителя». В приведенном примере он находится в 4-м столбце под номером 761.
С помощью команды «kill» пошлем сигнал завершения, чтобы зомби процесс прекратил своё существование в системе.
В вашем случае вместо 761 будет стоять другое значение. Его нужно правильно обнаружить.
Данные рекомендации созданы для тех пользователей, которые любят порядок во всем. Но еще раз напоминаем: зомби в операционной системе Линукс безвредны, и являются абсолютно логичным следствием ошибки.
Источник