Как можно идентифицировать детей детского процесса? - PullRequest
1 голос
/ 29 июня 2011

У меня есть долго работающая программа Python, которая запускает и останавливает сервер Postgres в рамках своей работы.Я остановил сервер с помощью подпроцесса, чтобы вызвать pg_ctl -m fast.Как запасной вариант, я проверяю код возврата и, в случае сбоя, запускаю pg_ctl -m immediate.

. Проблема в том, что иногда оба сбоя.Я не смог воспроизвести это сам, но это происходит с некоторой частотой для пользователей моей программы.Я регистрирую stdout / stderr по вызовам pg_ctl, но не получаю там никакой полезной информации.Насколько я могу судить, мастер-процесс или его дочерние элементы перестали отвечать на SIGQUIT, и единственный способ прекратить их - это SIGKILL, который pg_ctl не использует.сторона Postgres.Я использую Postgres 8.3, поэтому я уверен, что обновление до более новой версии решит эту проблему, но, к сожалению, это не вариант для меня.Единственное решение, которое я могу придумать, - это убить детей вручную.Но я не знаю, как отличить детей, порожденных моими pg_ctl start и другими postgres процессами, которые могут выполняться на машине.

Есть ли способ идентифицировать процесс как потомкаеще один процесс, который я породил?Кроссплатформенный способ сделать это из Python был бы идеальным, но я готов написать расширение C, если для этого существуют API в Windows / Linux / UNIX.

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Вот простое решение сценария оболочки:

pgrep -P $(head -1 $PGDATA/postmaster.pid)

Это распечатывает PID дочерних процессов.

Мне не известен стандартный модуль Python, который может получить эту информацию. pgrep получает информацию от /proc, так что вы можете переопределить ее в Python, но я сомневаюсь, что она того стоит.

0 голосов
/ 29 июня 2011

Стандарт C ++ не знает о многопроцессорных системах.Поэтому не существует API для взаимодействия с процессами.(В конце концов, как стандарт мог бы предписывать многопроцессорную систему на 8-битном микроконтроллере?)

Более того, некоторые платформы (например, подсистема Win32 в Windows NT) не отслеживают родительские дочерние отношения процесса.(NT скрытно скрывается, но вам придется вызывать недокументированные API, чтобы получить информацию)

Я вполне уверен, что POSIX действительно определяет такие API, но я не использовал их сам.

...