Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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?

share|improve this question

5 Answers 5

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.

share|improve this answer
    
I guess I have to get into that continuous-integration-thing finally. –  Rene Saarsoo Sep 15 '09 at 9:49
1  
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

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.

share|improve this answer

For windows user:

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

share|improve this answer

On Linux, just use nohup:

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

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...

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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