Как определить состояние процесса (т.е. если это зомби) - PullRequest
2 голосов
/ 11 марта 2009

как я могу получить информацию о состоянии процесса (то есть, если это зомби), использующего C под Linux?

После прочтения ответов я хочу немного сузить свой вопрос: я бы предпочел чисто C-решение. После прочтения исходного кода ps (который читает / proc /) я подумал, что должен быть лучший способ, и спросил здесь:)

Ответы [ 5 ]

7 голосов
/ 11 марта 2009

Вы захотите узнать о взаимодействии с / proc / "psuedo-filesystem" с помощью типичных вызовов стандартной библиотеки языка C. Документация, необходимая для начала работы, входит в состав любого дистрибутива Linux и представляет собой простой поиск в Google.

(Теперь, когда вы знаете, что искать. Я знаю, что это обычно большая часть проблемы!)

Короче говоря, каталоги и файлы в каталоге / proc / работающей системы Linux отражают состояние работающего ядра, которое (естественно) включает в себя процессы. Однако, прежде чем вы начнете взимать плату, вам нужно помнить некоторую информацию.

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

Обычно это происходит, когда процесс запускается программой. Видите ли, ядро ​​не удалит запись готового подпроцесса в таблице процессов, пока родительская программа не получит правильное состояние возврата подпроцесса. В этом есть смысл; как еще родительская программа узнает, что подпроцесс завершился неправильно?

Таким образом, все подпроцессы технически являются зомби, по крайней мере, в течение очень короткого времени. Для программы не является плохим состоянием.

Действительно, "зомби" иногда создаются намеренно. Например, иногда запись о зомби на некоторое время остается на месте, чтобы другие запущенные процессы не получали тот же PID, что и ранее запущенный (и теперь зомби) процесс.

Другими словами, если вы без необходимости запускаете процессы зомби SIGCHLD, вы можете создать серьезную проблему для нерестовой программы. Однако, если процесс был зомби в течение получаса или более, это, вероятно, признак ошибки.

Редактировать: Вопрос изменился на меня! Нет, нет более простого способа, чем как это делает PS. Если бы он был, он был бы интегрирован в PS давно. Файлы / proc являются основным источником информации о состоянии ядра. :)

2 голосов
/ 11 марта 2009

Вы хотите, чтобы процессы выполнялись на вашем компьютере, затем используйте

$ ps aux

ps отображает информацию о выборе активных процессов. Если вы хотите повторное обновление выбора и отображаемой информации, используйте top .

2 голосов
/ 11 марта 2009

Я знаю только два пути:

  • Синтаксический вывод команды ps
  • Чтение файлов в / proc / PID, где PID - идентификатор процесса (это то, что ps делает внутри)
0 голосов
/ 26 апреля 2012

Псевдо файловая система / proc описывает внутренние структуры данных ядра и дает вам возможность напрямую изменять некоторые значения. Получение состояния конкретного процесса может быть легко реализовано с помощью функций ввода-вывода. Правильный файл для разбора: / proc / {PID} / status

Команда ниже может использоваться для получения процессов в состоянии Зомби.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
0 голосов
/ 11 марта 2009

Найдено здесь :

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Это может быть легко проанализировано с помощью C.

...