fabricmongrel2

Starting mongrel2 with in a fabric deployment script


I'm trying to deploy a web app in Brubeck, a tornado-like python framework that runs on top of mongrel2 and I'm having trouble deploying mongrel2 in a fabric script.

From my fabfile:

with cd(project_dir):
    run('mkdir -p run && mkdir -p log && mkdir -p tmp')
    run('m2sh load -config mongrel2.conf -db the.db')
    sudo('m2sh start -db the.db -host localhost -sudo')

and my mongrel2.conf is very basic:

brubeck_handler = Handler(
    send_spec='ipc://127.0.0.1:9999',
    send_ident='34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
    recv_spec='ipc://127.0.0.1:9998', 
    recv_ident='')
brubeck_host = Host(
    name="localhost", 
    routes={
        '/': brubeck_handler})
brubeck_serv = Server(
    uuid="f400bf85-4538-4f7a-8908-67e313d515c2",
    access_log="/log/mongrel2.access.log",
    error_log="/log/mongrel2.error.log",
    chroot="./",
    default_host="localhost",
    name="brubeck app",
    pid_file="/run/mongrel2.pid",
    port=6767,
    hosts = [brubeck_host]
)
settings = {"zeromq.threads": 1}
servers = [brubeck_serv]

Basically, I can start mongrel2 fine on the server using the same m2sh start command as above. But when I run the fabric task, the mkdir and m2sh load tasks run fine, but then mongrel2 just doesn't start. Anyone know why that start command would work when I paste it into the command line on the server but doesn't work in a deploy script? AFAIK the -sudo option runs mongrel2 as a backround process, so I don't think it's an issue of the shell being closed (I tried using "nohup" just in case but that didn't help). Should I be doing something different to start mongrel2?


Solution

  • So since this question hasn't been answered, I'll answer it with the workaround I'm using. I'm still not exactly sure what's going on (I don't care to read the docs closely enough to know exactly what m2sh is doing), but it's clearly doing some things in a forked process before mongrel2 actually starts. So when this command returns and fabric disconnects, it hasn't had time to finish doing its thing and mongrel2 doesn't start.

    This workaround fixes it for me:

    sudo('m2sh start -db the.db -host localhost -sudo && sleep 1')
    

    I don't love it because 1 second is a completely arbitrary amount of time, but it has worked every time since I implemented it. @Morgan's answer sounded like it would work, but as I mentioned in the comment pty=False just causes fabric to hang.