Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

Hey i need some help with the Init.d script for Nginx This is my Nginx files locations -

  nginx path prefix: "/usr/local/nginx"  nginx binary file: "/usr/local/nginx/nginx"
  nginx configuration prefix: "/usr/local/nginx"
  nginx configuration file: "/usr/local/nginx/nginx.conf"
  nginx pid file: "/usr/local/nginx/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"

And this is my Init.d script -

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /usr/local/nginx/nginx ] ; then
        . /usr/local/nginx/nginx
fi

set -e

case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /usr/local/nginx/nginx.pid \
                --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/nginx.pid \
                --exec $DAEMON
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /usr/local/nginx/nginx.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /usr/local/nginx/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/nginx.pid \
          --exec $DAEMON
      echo "$NAME."
      ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac

exit 0

I try to modified it for my files location but its still doesn't work , what i need to change for make it work ?

share|improve this question
    
Can you give us any log info ? what happens when you launch it from command line ? –  wojciechz Sep 13 '12 at 0:49
    
This is what happened when i am launching it - –  Ido B Sep 13 '12 at 0:51
    
ñÿn¼r/local/nginx/nginx: 1: cannot open ñÿÀ å: No such file /usr/local/nginx/nginx: 2:u¼ ñÿdÄ _: not found /usr/local/nginx/nginx: 8: Syntax error: word unexpected (expecting ")") –  Ido B Sep 13 '12 at 0:52
    
In my opinion you have a) syntax error in nginx file (try to test the config file with nginx -t b) paths mismatch - typically nginx should reside in something like /prefix/whatever/sbin/nginx not in /prefix/whatever/nginx –  wojciechz Sep 13 '12 at 0:54
    
I change this 2 lines PATH= , DAEMON= to this - –  Ido B Sep 13 '12 at 1:01
show 4 more comments

1 Answer

I've written this (initially took over from debian) for Gentoo and I suggest using it because it works and has better debug output:

#!/bin/bash
echo "Script executed from: ${PWD}"

BASEDIR=$(dirname $0)
echo "Script location: ${BASEDIR}"

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="${PWD}/../cfg/nginx.conf"

echo "Using config file: ${NGINX_CONF_FILE} "

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx

PS="nginx"
PIDNAME="nginx"             #lets you do $PS-slave
PIDFILE=$PIDNAME.pid                    #pid file
PIDSPATH=/var/run

DESCRIPTION="Nginx Server..."

RUNAS=root                              #user to run as

SCRIPT_OK=0                             #ala error codes
SCRIPT_ERROR=1                          #ala error codes
TRUE=1                                  #boolean
FALSE=0                                 #boolean

#------------------------------------------------------------------------------
#                               Simple Tests
#------------------------------------------------------------------------------

#test if nginx is a file and executable
test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi

#set exit condition
#set -e

#------------------------------------------------------------------------------
#                               Functions
#------------------------------------------------------------------------------

setFilePerms(){

        if [ -f $PIDSPATH/$PIDFILE ]; then
                chmod 400 $PIDSPATH/$PIDFILE
        fi
}

configtest() {
    $DAEMON -t -c $NGINX_CONF_FILE
}

getPSCount() {
    return `pgrep -f $PS | wc -l`
}

isRunning() {
        if [ $1 ]; then
                pidof_daemon $1
                PID=$?

                if [ $PID -gt 0 ]; then
                        return 1
                else
                        return 0
                fi
        else
                pidof_daemon
                PID=$?

                if [ $PID -gt 0 ]; then
                        return 1
                else
                        return 0
                fi
        fi
}

#courtesy of php-fpm
wait_for_pid () {
        try=0

        while test $try -lt 35 ; do

                case "$1" in
                        'created')
                        if [ -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;

                        'removed')
                        if [ ! -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;
                esac

                #echo -n .
                try=`expr $try + 1`
                sleep 1
        done
}

status(){
    isRunning
    isAlive=$?

    if [ "${isAlive}" -eq $TRUE ]; then
                echo "$PIDNAME found running with processes:  `pidof $PS`"
        else
                echo "$PIDNAME is NOT running."
        fi


}

removePIDFile(){
    if [ $1 ]; then
                if [ -f $1 ]; then
                    rm -f $1
            fi
        else
        #Do default removal
        if [ -f $PIDSPATH/$PIDFILE ]; then
                    rm -f $PIDSPATH/$PIDFILE
            fi
        fi
}

start() {
        echo "Starting $DESCRIPTION"

    isRunning
    isAlive=$?

        if [ "${isAlive}" -eq $TRUE ]; then
                echo $SCRIPT_ERROR
        else
                start-stop-daemon --start --quiet --chuid $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \
                -- -c $NGINX_CONF_FILE
                setFilePerms
                echo $SCRIPT_OK
        fi
}

stop() {
    echo "Stopping $DESCRIPTION"

    isRunning
    isAlive=$?
        if [ "${isAlive}" -eq $TRUE ]; then
                start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE

        wait_for_pid 'removed' $PIDSPATH/$PIDFILE

                if [ -n "$try" ] ; then
                        echo $SCRIPT_ERROR
                else
                        removePIDFile
                    echo $SCRIPT_OK
                fi

        else
                echo $SCRIPT_ERROR
        fi
}

reload() {
    configtest || return $?

    echo "Reloading (via HUP) $DESCRIPTION"

        isRunning
        if [ $? -eq $TRUE ]; then
        `killall -HUP $PS` #to be safe

                echo $SCRIPT_OK
        else
                echo $SCRIPT_ERROR
        fi
}

quietupgrade() {
    echo "Peforming Quiet Upgrade $DESCRIPTION"

        isRunning
        isAlive=$?
        if [ "${isAlive}" -eq $TRUE ]; then
        kill -USR2 `cat $PIDSPATH/$PIDFILE`
        kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin`

        isRunning
        isAlive=$?
        if [ "${isAlive}" -eq $TRUE ]; then
            kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
            wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                        removePIDFile $PIDSPATH/$PIDFILE.oldbin

            echo $SCRIPT_OK
        else
            echo $SCRIPT_ERROR

            echo "ERROR! Reverting back to original $DESCRIPTION"

            kill -HUP `cat $PIDSPATH/$PIDFILE`
            kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin`
            kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`

            wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                        removePIDFile $PIDSPATH/$PIDFILE.oldbin

            echo $SCRIPT_ok
        fi
        else
                echo $SCRIPT_ERROR
        fi
}

terminate() {
        echo "Force terminating (via KILL) $DESCRIPTION"

    PIDS=`pidof $PS` || true

    [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`

    for i in $PIDS; do
        if [ "$i" = "$PIDS2" ]; then
                kill $i
                        wait_for_pid 'removed' $PIDSPATH/$PIDFILE
            removePIDFile
        fi
    done

    echo $SCRIPT_OK
}

destroy() {
    echo "Force terminating and may include self (via KILLALL) $DESCRIPTION"
    killall $PS -q >> /dev/null 2>&1
    echo $SCRIPT_OK
}

pidof_daemon() {
    PIDS=`pidof $PS` || true

    [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`

    for i in $PIDS; do
        if [ "$i" = "$PIDS2" ]; then
            return 1
        fi
    done
    return 0
}

case "$1" in
  start)
    start
        ;;
  stop)
    stop
        ;;
  restart|force-reload)
    stop
    sleep 1
    start
        ;;
  reload)
    $1
    ;;
  status)
    status
    ;;
  configtest)
        $1
        ;;
  quietupgrade)
    $1
    ;;
  terminate)
    $1
    ;;
  destroy)
    $1
    ;;
  *)
    FULLPATH=/etc/init.d/$PS
    echo "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"
    echo "       The 'destroy' command should only be used as a last resort." 
    exit 1
    ;;
esac

exit 0
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.