Executando o gancho post-commit do Subversion como um processo em segundo plano

5

Como atualmente nossos ganchos de pós-commit do Subversion demoram muito para serem executados, eu estou tentando acelerar as coisas.

Estou pensando em executar os ganchos reais como um processo em segundo plano, para que o svn commit seja concluído antes que os ganchos reais sejam concluídos.

Então criei dois arquivos.

Um post-commit.bg que consome alguma coisa:

sleep 10

E o próprio post-commit em si que executa o primeiro em segundo plano:

bash post-commit.bg &

Quando executo post-commit da linha de comando, ele termina rapidamente, deixando post-commit.bg ainda em execução. Mas quando eu faço svn commit ainda leva 10 segundos!

Os processos em segundo plano de alguma forma não são permitidos pelo SVN ou o que eu poderia estar fazendo de errado aqui?

    
por Rene Saarsoo 15.09.2009 / 10:25

6 respostas

5

Eu apenas confirmei isso localmente. Parece ser por design:

Quando exibindo ganchos , o svn chamadas apr_proc_wait

O

apr_proc_wait foi projetado para aguardar até que todos os processos filhos sair antes de voltar. Isso é para evitar que processos de zumbis (sem proprietário) invadam o sistema.

Você pode ter algum sucesso se encontrar uma maneira de desanexar o processo (isto é, modo daemon), mas não tenho certeza.

Você pode achar melhor executar outro processo em algum lugar que funcione em resposta a um ping do svn - Hudson minha escolha para esse tipo de coisa - empregos podem ser acionados por um wget em um gancho de pós-commit , ou você pode tê-lo poll subversion para você, dependendo do que você quer fazer.

    
por 15.09.2009 / 11:32
11

Você precisa redirecionar o stderr também:

bash post-commit.bg 2 > & 1 &

Isso desanexará o processo do processo pai (no que diz respeito à subversão) e deixará o cliente terminar sem esperar. Eu tive esse mesmo problema, e essa foi a correção.

    
por 22.07.2010 / 05:16
2

No Linux, use apenas nohup :

nohup sh -c 'sleep 10' &
    
por 02.02.2010 / 06:40
2

Para o usuário do Windows:

Este tópico já foi discutido aqui: Executar outro programa no arquivo bat do Windows e não criar processo filho

    
por 03.06.2011 / 15:21
1

Eu testei com sucesso algum código Python que não suporta os ganchos do subversion. Você tem que redirecionar especificamente a saída de stdout e stderr como apontado por Bert Huijben acima. Veja o exemplo de código abaixo.

arquivo post-commit:

#!/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:])

Que chamou o script que eu nomeei de postNotify.py:

#!/usr/bin/env python2.7

import os, sys, time

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

* edit 1 - Devo mencionar que isso foi contra o Subversion 1.9.3

    
por 31.03.2017 / 01:09
0

Eu acho que dehmann está certo. você também pode registrar o post-commit.bg para ser executado como um processo em lote - no linux, use o comando 'batch' (at) para isso; mas preste atenção ao potencial rearranjo ...

    
por 02.02.2010 / 08:52