Назад | Перейти на главную страницу

Запуск обработчика Subversion после фиксации в качестве фонового процесса

Поскольку в настоящее время наши перехватчики после фиксации Subversion выполняются слишком долго, я пытался ускорить процесс.

Я думал о выполнении фактических хуков в качестве фонового процесса, чтобы svn commit завершится до того, как завершатся фактические крючки.

Итак, я создал два файла.

А post-commit.bg что делает что-то трудоемкое:

sleep 10

И собственно post-commit сам, который выполняет первое в фоновом режиме:

bash post-commit.bg &

Когда я бегу post-commit из командной строки он быстро завершается, оставляя post-commit.bg Все еще работает. Но когда я сделаю svn commit это все равно занимает 10 секунд!

Фоновые процессы как-то запрещены SVN или что я здесь делаю не так?

Вам также необходимо перенаправить stderr:

bash post-commit.bg 2> & 1 &

Это отделит процесс от родительского процесса (что касается подрывной деятельности) и позволит клиенту завершить работу без ожидания. У меня была такая же проблема, и это было исправление.

Я только что подтвердил это на месте. Похоже, это было задумано:

когда крючки для бега, svn вызывает apr_proc_wait

apr_proc_wait предназначен для ожидания завершения всех дочерних процессов перед возвратом. Это сделано для того, чтобы зомби-процессы (не принадлежащие владельцам) не захватили систему.

Вы мощь иметь некоторый успех, если вы найдете способ отсоединить процесс (например, режим демона), но я не уверен.

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

В Linux просто используйте nohup:

nohup sh -c 'sleep 10' &

Для пользователя Windows:

Эта тема здесь уже обсуждалась: Запуск другой программы в bat-файле Windows без создания дочернего процесса

Я успешно протестировал некоторый код Python, который не выдерживает перехватчиков подрывной деятельности. Вы должны специально перенаправить вывод stdout и stderr, как указано выше Бертом Хуйбеном. См. Пример кода ниже.

файл после фиксации:

#!/usr/bin/env python2.7

import os, sys, subprocess

def main(args):
    try:
        #Subversion hook will still wait even though you didn't redirect stdout or stderr
        #subprocess.Popen(['<PATH_TO_SVN>/hooks/postNotify.py', args[0], args[1]])
        #This works however
        devNull = open(os.devnull, 'w')
        subprocess.Popen(['<PATH_TO_SVN>/hooks/postNotify.py', args[0], args[1]], stdout=devNull, stderr=devNull)
        devNull.close()
    except BaseException as e:
        sys.stderr.write('Failed to launch notify script with error {}\n'.format(str(e))
        sys.exit(1)
    sys.exit(0)

if __name__ == '__main__':
    main(sys.argv[1:])

Это вызвало сценарий, который я назвал postNotify.py:

#!/usr/bin/env python2.7

import os, sys, time

time.sleep(15)
os.stderr.write('Generic Problem\n')
sys.exit(1)

* изменить 1 - я должен упомянуть, что это было против Subversion 1.9.3

Думаю, Дехманн прав. вы также можете зарегистрировать post-commit.bg для выполнения как пакетный процесс - в Linux используйте для этого команду 'batch' (at); но обратите внимание на возможные перетасовки ...