Daemonize a Yesod application

Posted on by nek0 in english, meta, programming

If you want to create a systemd service file, look here

As you might know I have written my own commenting service, which up until recently I had to start manually in a screen session. Then I decided to write my own init-script.

I have to admit, that I am no experienced sysadmin or something like that, but just a random guy with a strange love (or addiction) to computers. So this is my first time doing this.

For managing the starting and stopping of the service I chose to use the start-stop-daemon shipped with the system on my server. Additionally I used the skeleton file for init-scripts, which you can find in /etc/init.d/skeleton.

After consulting the manpage of start-stop-daemon I came up with the following command for starting the commenting service:

start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
-- config/settings.yml > /var/log/yacs.log

What this actually means: The first option ist pretty self explanatory. -b starts the service in the background. -u and --chuid ensure, that the service runs as a user, not as root. I chose my own user here, but you can also use nobody if you like. The name of the service is specified by --name. -d specifies the working directory of the service you want to start and finally --exec is the path to the executable, in this case relative to the working directory. Everything after the final double-dashes are arguments passed to the executable itself.

for stopping the whole thing I use the following command:

start-stop-daemon --stop -u nek0 --name yacs

This is even simpler than the above and is really self explanatory after all the information you got above.

the whole init-script looks like this:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          yacs
# Required-Start:    $nginx
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Start YACS commenting service
# Description:       start YACS commenting service
### END INIT INFO

case "$1" in
  start)
        logger starting YACS
        start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
        -- config/settings.yml > /var/log/yacs.log
        ;;
  stop)
        logger stopping YACS
        start-stop-daemon --stop -u nek0 --name yacs 
        ;;
  restart)
        logger restarting YACS
        start-stop-daemon --stop -u nek0 --name yacs
        start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
        -- conifg/settings.yml > /var/log/yacs.log
        ;;
  status)
        # No-op
        ;;
  *)
        echo "Usage: yacs {start|stop|restart}" >&2
        exit 3
        ;;
esac

I hope this is helpful for others. If something is unclear, you can always leave a comment now ^^

Tags: administration art bitcoin comic crypto deutsch devlog: pituicat devlog: tracer drawing english hacking hardware meta misc personal programming projects writing