Upstart scripts for a Go Web App
Wrote simple scripts to start/stop a go web app. Sometimes we need to start a pool of worker apps on specific ports. Following scripts help.
These scripts are system jobs for upstart and are to be placed in /etc/init.
app-worker.conf
description "App-Worker"
author "Adnaan"
start on (net-device-up
and local-filesystems
and runlevel [2345])
stop on runlevel [06]
respawn
instance $PORT
script
#initramfs provides early userspace
exec 2>>/dev/.initramfs/app-worker.log
set -x
export APP="/root/goworkspace/src/myappcode"
#change directory or go won't read the web app resources
chdir $APP
#execute
exec sudo $APP/app --port $PORT
end script
The above script can be directly used as such:
Start a worker
service app-worker start PORT=8085
Stop a worker
service app-worker stop PORT=8085
But what if need a bunch of workers. Can't go starting them individually now, can we?
app-pool.conf
description "App Pool"
author "Adnaan"
start on (local-filesystems and net-device-up and runlevel [2345])
stop on shutdown
pre-start script
#initramfs provides early userspace
exec 2>>/dev/.initramfs/app-pool.log
set -x
start app-worker PORT=8085
start app-worker PORT=8086
#add more jobs..
end script
Start a Pool
service app-pool start
Stop the Pool
service app-pool stop
The above won't have any effect since it restarts the workers again. We need to individually stop the workers. Let's find our workers.
initctl list | grep "app"
Choose your worker from the list and stop it as described above. I realize that we are individually stopping the workers. Well I am still looking for a good solution to do that in a single step. Suggestions welcome!
Written by Adnaan Badr
Related protips
2 Responses
For stopping have each worker listening on an event:
stop on shutdown or workers-stop
And then, when you want to shutdown your workers you just emit that event.
initctl emit workers-stop
See also this post, which accomplishes something very similar: http://clock.co.uk/blog/upstart-and-nodejs