Friday, January 28, 2011

What's the correct way to start a Ubuntu Upstart script from another Upstart script?

I have three Ubuntu Upstart scripts:

  • browser runs an instance of firefox as an unprivileged user
  • browsers starts when screen is started and launches
    • browser PORT=1
    • browser PORT=2
    • browser PORT=3
  • screen starts a Xvfb server

The chain is:

  1. screen starts at runlevels 2, 3, 4, 5
  2. browsers is configured to start on started screen and to stop on stopping screen
  3. each instance browser PORT=? will stop on stopping browsers and will be started by browsers

Issue

screen starts fine but doesn't start browsers (or it does and browsers fails to start browser PORT=?).

If I sudo start browser PORT=1 everything works fine, whereas sudo start browsers doesn't even start itself.

Code

#screen.conf
env DISPLAY=:99
env USER=worker

start on runlevel [2345]
stop on runlevel [!2345]

respawn

script 
        su ${USER} -c "/usr/bin/Xvfb ${DISPLAY}"
end script

#browsers.conf
start on started screen
stop on runlevel [!2345] or stopping screen

respawn

expect fork #the following "start browser ..." do fork

script
       start browser PORT=4242
       start browser PORT=4243
       start browser PORT=4244
       start browser PORT=4245
end script

#browser.conf
instance $PORT

stop on runlevel [!2345]
stop on stopping browsers or stopping screen

respawn

script 
        su ${USER} -c "/usr/bin/firefox -no-remote -P ${PORT} --display ${DISPLAY}"
end script

UPDATE (10/21/2010): the (modified) code above now works. However, when I need to stop browsers, all the instances of browser PORT=? are correctly terminated, while `browsers gets stuck.

How do I solve this other issue?

  • Lucid comes with upstart v0.6.x, which means you can't have multiple "stop on" or "start on" lines. You have to combine the conditions together with and, or & parentheses.

    You can read the job description syntax in the init(5) manpage (available online or run man 5 init in a terminal).

    phretor : @JanC, using the right syntax solved my problems, i.e., now they boot. Unfortunately, to make browsers booting I had to put "expect fork" (because "start browser PORT=4242" forks). This causes "sudo stop browsers" to stuck). Any suggestion?
    JanC : Maybe it forks too often so that upstart doesn't know the correct PID (that's a known problem with the current upstart, and which should be fixed in the next release of it)
    From JanC

0 comments:

Post a Comment