2016-05-27 3 views
0

У меня есть случай, когда у меня есть процесс, который составляет parent, и он порождает различные процессы , которые контролируют соединение ssh. Этот процесс parent должен работать бесконечно как часть службы. Но, когда одно из этих соединений ssh закрыто, тогда процесс child становится процессом zombie. Таким образом, создается много процессов zombie, каждый раз когда соединение ssh закрывается.Удаление процесса зомби

Я хочу, чтобы количество zombie процессов было минимальным. Насколько мне известно, SIGTERM или SIGKILL удаляет zombie процесс. Поскольку процесс parent работает бесконечно, процесс zombie не может быть удален, ожидая завершения parent.

Есть ли способ удалить процесс зомби? Или что-то, что я понял неправильно?

ответ

1

В программировании на языке C вы можете использовать системный вызов waitpid в родительском процессе.

В командной строке linux или скрипте оболочки вы можете использовать команду wait для удаления зомби.

waitpid страница руководства,

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

Синтаксис: -

pid_t waitpid(pid_t pid, int *status, int options); 

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

int status; 
waitpid(0, &status, WNOHANG); 

Когда родительский процесс делает получает статус ребенка на выход, то только процесс зомби создается. Таким образом, используя waitpid с параметром WNOHANG, вы можете получить дочерний выход staus. Если опция WNOHANG предоставляется, она не будет блокировать родителя. Есть ли какой-либо дочерний элемент, он сохраняет статус выхода в переменной состояния и возвращает. В противном случае он не будет ждать, он просто вернется.

Прочтите справочную страницу waitpid, чтобы узнать о системном вызове waitpid.

+0

Я использую python. Я попробовал то же самое. Вместо 'join()' я заменил его на 'os.waitpid (pid, os.WNOHANG)'. Тем не менее создаются процессы 'zombie'. Я делаю что-то неправильно? – nidHi

+0

Вы проверили возвращаемое значение waitpid? –

+0

Я не знаю в python. Но я думаю, что мы должны передать любой аргумент os.waitpid, чтобы получить статус существования? –

Смежные вопросы