Ubuntu – What’s the correct way to start a Ubuntu Upstart script from another Upstart script

startupUbuntuupstart

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?

Best Answer

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