Mono SVN Post-Commit Hook no sale cuando se ejecuta bajo Apache

Tenemos un server Ubuntu 14.04 LTS SVN reemplazando nuestro server original de Windows 2003. Ambos ejecutan SVN a través de Apache. Parte del trato es que nuestros enganches .Net commit existentes se transfieren por un lado – estos manejan cosas como la actualización de nuestro rastreador de proyecto y la ejecución de trabajos de compilation. En general, he tenido éxito: la mayoría de las cosas se ejecutan de forma nativa bajo Mono. He instalado mono-complete en el server.

Cuando se ejecuta bajo un usuario normal en el server, y con sudo -u www-data , el enganche se ejecuta y sale limpia y correctamente. También intenté invocar Mono con env - para dar un entorno vacío, pero el process aún se completa como se esperaba.

El problema surge cuando el gancho se dispara. Se invoca a Mono y el progtwig continúa normalmente. Sin embargo, no sale. He puesto logging extenso en el progtwig y vuelve a Main (), desde donde debería devolver un código de salida al finalizar. Esto no sucede; en cambio, se cuelga infinitamente. Realizar un strace en el process devuelve futex(0x982440, FUTEX_WAIT_PRIVATE, 0, NULL por lo que parece que el process está esperando algo. Este comportamiento se produce en .Net 3.5 y .Net 4.0.

El problema obvio aquí es que el control no regresa a svn hasta que el gancho sale, por lo que el cliente continúa esperando la confirmación.

Lo único que noté es que con frecuencia (pero no siempre) aparecen dos instancias ejecutándose cuando se ven en htop , una ejecutándose bajo Apache y una segunda ejecutándose directamente bajo init. Es como si Mono hubiera bifurcado el process por completo. Ambos deben ser asesinados con SIGKILL; no responden a SIGTERM, y matar a uno no afecta al otro.

Estoy al final de mi ingenio aquí. No hay límites de security establecidos en los processs. Reemplazar Main () devolviendo int con void y llamando explícitamente a Environment.Exit () tampoco funciona. Parece que el control simplemente no regresará del gancho al sistema.

Editar: Acabo de probar en un server Debian 7 configurado de la misma manera y encuentro exactamente el mismo problema. Ambos tienen mono-complete instalado. En Ubuntu, es v3.2.8. En Debian, es v2.10.8.1. Realmente estoy completamente estancado ahora.

Edición 2: siguiendo el consejo de un amigo, configuré el PCH como un trabajo de cron para ver si la falta de TTY está causando el problema. Funciona según lo esperado bajo cron y sale limpiamente. Sin processs pendientes. Estoy en una pérdida total para explicar esto.

Editar 3: en la vista de otro amigo, intenté crear un shell explícitamente para ejecutar el PCH:

 #!/bin/bash if [ "$#" -ne 3 ]; then echo "Expected exactly three arguments (given $#, values $*). Use: $0 repository revision transaction" 1>&2; exit 1; fi logfile="/var/svn/postcommithook/postcommithook.log"; repo=$1; revision=$2; echo "$(date) Starting post-commit for $repo at $revision" >> $logfile; author=$(svnlook author $repo -r $revision); echo "$(date) Running post-commit hooks" >> $logfile; /bin/bash -c "/usr/bin/mono /var/svn/postcommithook/PostCommitHook.exe $repo $revision $author verbose < /dev/null >> $logfile 2>&1" if [ $? != 0 ]; then echo "$(date) Post-Commit failed with error code $? - commit has succeeded" >> $logfile; exit $?; fi echo "$(date) Complete" >> $logfile; 

No dados. Aún se cuelga. ¿Por qué no sale este process?