Because currently our Subversion post-commit hooks take way too long to execute I've been trying to speed things up.

I've been thinking about executing the actual hooks as a background process, so that the svn commit would complete before the actual hooks finish running.

So I created two files.

A post-commit.bg that does something time-consuming:

sleep 10

And the actual post-commit itself that executes the former in background:

bash post-commit.bg &

When I run post-commit from command line it finishes quickly, leaving post-commit.bg still running. But when I do svn commit it still takes 10 seconds!

Are background processes somehow disallowed by SVN or what could I be doing wrong here?

link|improve this question
feedback

5 Answers

up vote 5 down vote accepted

I just confirmed this locally. It appears to be by design:

When running hooks, svn calls apr_proc_wait

apr_proc_wait is designed to wait until all child processes exit before returning. This is to avoid zombie(unowned) processes overrunning the system.

You might have some success if you find a way to detach the process (ie, daemon mode), but I'm not sure.

You might find it better to run another process somewhere which does some work in response to a ping from svn - Hudson is my choice for this sort of thing - jobs can be triggered by a wget in a post-commit hook, or you can have it poll subversion for you, depending on what you want to do.

link|improve this answer
I guess I have to get into that continuous-integration-thing finally. – Rene Saarsoo Sep 15 '09 at 9:49
You have to detach stdin, stdout and stderr to allow subversion to continue. (You can do this when calling your program, but how depends on your shell). – Bert Huijben Sep 16 '09 at 13:13
feedback

You need to redirect stderr also:

bash post-commit.bg 2>&1 &

That will detach the process from the parent process (as far as subversion is concerned) and let the client finish without waiting. I had this same problem, and that was the fix.

link|improve this answer
feedback

On Linux, just use nohup:

nohup sh -c 'sleep 10' &
link|improve this answer
feedback

I think dehmann is right. you can also register post-commit.bg to be executed as a batch process - on linux, use the 'batch' command (at) for that; but pay attention to the potential reshuffling...

link|improve this answer
feedback

For windows user:

This topic has already been discussed here: Running another program in Windows bat file and not create child process

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.