Согласно git documentation посту-получить крюк по существу блокирует репо, пока не будет завершен:мерзавец после приема крючка не работает в фоновом режиме
... клиент не отключается до тех пор, пока не будет завершен, поэтому будьте осторожны, если вы попытаетесь сделать что-нибудь, что может занять много времени.
Это вызывает проблему, если вам нужен крючок для запуска задания на сборку, а затем опрос для его завершения, прежде чем начинать с другого, скажем, развертывание, работу. Например, сервер сборки не может извлекать данные из репо при запуске указанного скрипта.
Предположим, что у вас нет абсолютно никакой возможности разместить сценарий на сервере git для выполнения в виде команды оболочки с помощью всего подхода nohup /usr/bin/env python /path/to/post_receive.py 2>&1 > /dev/null &
, аналогичного this question.
Давайте также предположим, что вы испробовали весь двойной os.fork()
«ИНГ процесса демона, похожий на this и несколько других вопросов (нерабочего примера кода ниже) и обнаружил, что мерзавец еще ждет продолжительного ребенок до завершения крюка.
pid = os.fork()
if pid == 0:
os.setsid()
pid = os.fork()
if pid == 0:
long_running_post_receive_function()
else:
os._exit(0)
else:
for fd in range(0, 3):
os.close(fd)
os._exit(0)
Таким образом, с этими ограничениями, кто-нибудь был успешным с длинным работает питона после получения крюком, который на самом деле работает в фоновом режиме, не блокируя репо?
EDIT
работает минимальной структуры, без обработки исключений ... благодаря @torek и @jthill
pid = os.fork()
if pid == 0:
os.setsid()
pid = os.fork()
if pid == 0:
for fd in range(0, 3):
os.close(fd)
long_running_post_receive_function()
else:
os._exit(0)
else:
sys.exit()
Вы также можете использовать какую-то модель производителя/потребителя, в которой хук после приема отправляет какое-то «асинхронное сообщение» (которое может быть таким же простым, как касание файла), что приводит к тому, что потребительский демон заметьте это и выполните свою работу. – Mort
Я, конечно, согласен с тем, что это альтернатива, которая действительно побеждает цель того, что я пытаюсь выполнить. –
Я устал, но мне кажется, что вы делаете свой dup2() не в том месте. Fd все еще открыты в длительном процессе. – jthill