У меня есть долго работающая программа 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.