Поскольку в настоящее время наши перехватчики после фиксации 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); но обратите внимание на возможные перетасовки ...