Skip to content

Instantly share code, notes, and snippets.

@kafecho
Created January 14, 2016 20:20

Revisions

  1. kafecho created this gist Jan 14, 2016.
    157 changes: 157 additions & 0 deletions couchdb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,157 @@
    #!/bin/sh
    # Init script for couchdb
    # Maintained by
    # Generated by pleaserun.
    # Implemented based on LSB Core 3.1:
    # * Sections: 20.2, 20.3
    #
    ### BEGIN INIT INFO
    # Provides: couchdb
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description:
    # Description: no description given
    ### END INIT INFO

    export HOME=/usr/local/lib/couchdb

    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    export PATH

    name=couchdb
    program=/usr/local/bin/couchdb
    args=''
    pidfile="/var/run/$name.pid"

    [ -r /etc/default/$name ] && . /etc/default/$name
    [ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name

    trace() {
    logger -t "/etc/init.d/couchdb" "$@"
    }

    emit() {
    trace "$@"
    echo "$@"
    }

    start() {

    # Ensure the log directory is setup correctly.
    [ ! -d "/var/log/" ] && mkdir "/var/log/"
    chown "$user":"$group" "/var/log/"
    chmod 755 "/var/log/"


    # Setup any environmental stuff beforehand


    # Run the program!

    #chroot --userspec "$user":"$group" "$chroot" sh -c "
    #
    # cd \"$chdir\"
    exec $program $args >> /var/log/couchdb.stdout 2>> /var/log/couchdb.stderr &

    # Generate the pidfile from here. If we instead made the forked process
    # generate it there will be a race condition between the pidfile writing
    # and a process possibly asking for status.
    echo $! > $pidfile

    emit "$name started"
    return 0
    }

    stop() {
    # Try a few times to kill TERM the program
    if status ; then
    pid=$(cat "$pidfile")
    trace "Killing $name (pid $pid) with SIGTERM"
    kill -TERM $pid
    # Wait for it to exit.
    for i in 1 2 3 4 5 ; do
    trace "Waiting $name (pid $pid) to die..."
    status || break
    sleep 1
    done
    if status ; then
    emit "$name stop failed; still running."
    else
    emit "$name stopped."
    fi
    fi
    }

    status() {
    if [ -f "$pidfile" ] ; then
    pid=$(cat "$pidfile")
    if ps -p $pid > /dev/null 2> /dev/null ; then
    # process by this pid is running.
    # It may not be our pid, but that's what you get with just pidfiles.
    # TODO(sissel): Check if this process seems to be the same as the one we
    # expect. It'd be nice to use flock here, but flock uses fork, not exec,
    # so it makes it quite awkward to use in this case.
    return 0
    else
    return 2 # program is dead but pid file exists
    fi
    else
    return 3 # program is not running
    fi
    }

    force_stop() {
    if status ; then
    stop
    status && kill -KILL $(cat "$pidfile")
    fi
    }


    case "$1" in
    force-start|start|stop|force-stop|restart)
    trace "Attempting '$1' on couchdb"
    ;;
    esac

    case "$1" in
    force-start)
    PRESTART=no
    exec "$0" start
    ;;
    start)
    status
    code=$?
    if [ $code -eq 0 ]; then
    emit "$name is already running"
    exit $code
    else
    start
    exit $?
    fi
    ;;
    stop) stop ;;
    force-stop) force_stop ;;
    status)
    status
    code=$?
    if [ $code -eq 0 ] ; then
    emit "$name is running"
    else
    emit "$name is not running"
    fi
    exit $code
    ;;
    restart)

    stop && start
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|force-start|stop|force-start|force-stop|status|restart}" >&2
    exit 3
    ;;
    esac

    exit $?