O serviço Ubuntu iniciado a partir do /etc/init.d termina com o PID errado

0

Esta pergunta segue a minha pergunta anterior . Para recapitular

  • Eu quero usar o OpenResty em vez de baunilha Nginx no meu servidor Ubuntu 14.04.
  • Eu cumpri o OpenResty seguindo as instruções aqui .
  • O nginx compilado acaba em '/ usr / local / openresty / nginx / sbin'
  • Agora posso fazer ./nginx dessa pasta para iniciar o nginx.

O problema é que eu preciso ter a capacidade de fazer coisas como service nginx status|reload|start|stop como normalmente faria se eu estivesse usando a versão do Nginx instalada via apt-get install nginx|nginx-extras etc.

Meu conhecimento de tais questões é bastante básico. No entanto, por meio de hackar o script /etc/init.d/nginx criado por apt-get install nginx e modificar as idéias descritas aqui Eu criei meu próprio script /etc/init.d/nginx que eu reproduzo abaixo

#!/bin/sh

NAME="nginx"
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
APP="/usr/local/openresty/nginx/sbin/nginx"

if [ -r /etc/default/nginx ]; then
 . /etc/default/nginx
fi

. /lib/init/vars.sh
. /lib/lsb/init-functions

PID=$(cat /usr/local/openresty/nginx/conf/nginx.conf | grep -Ev '^\s*#' | 
awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
if [ -z "$PID" ]
then
   PID=/var/run/nginx.pid
fi

if [ -n "$ULIMIT" ]; then
 ulimit $ULIMIT
fi

start() {
 printf "Starting '$NAME'... "
 start-stop-daemon --start --background --make-pidfile --pidfile    
 /var/run/$NAME.pid --exec "$APP"
 printf "done\n"
}

killtree() {
 local _pid=$1
 local _sig=${2-TERM}
 for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
    killtree ${_child} ${_sig}
 done
 kill -${_sig} ${_pid}
}

stop() {
 printf "Stopping '$NAME'... "
 [ -z 'cat /var/run/$NAME.pid 2>/dev/null' ] || \
 while test -d /proc/$(cat /var/run/$NAME.pid); do
  killtree $(cat /var/run/$NAME.pid) 15
  sleep 0.5
 done 
 [ -z 'cat /var/run/$NAME.pid 2>/dev/null' ] || rm /var/run/$NAME.pid
 printf "done\n"
}

case "$1" in
 start)
   start
   ;;
 stop)
  stop
  ;;
 restart)
  stop
  start
  ;;
reload)
  start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx.pid 
  --name nginx
  ;;            
status)
 status_of_proc -p /var/run/nginx.pid "nginx" "nginx" && exit 0 || exit $?
    ;;

*)
 echo "Usage: $NAME {start|stop|restart|reload|status}" >&2
 exit 1
 ;;
esac

exit 0

Com isso em vigor se eu reiniciar meu servidor e emitir um lsof -nP -i | grep LISTEN , obtenho a saída

nginx     2247     root    6u  IPv4  14166      0t0  TCP *:80 (LISTEN)
nginx     2248   nobody    6u  IPv4  14166      0t0  TCP *:80 (LISTEN)

Uma das coisas que não entendo aqui - por que dois usuários: root & amp; ninguém? Então, se eu visitasse o servidor de um navegador e executasse um script PHP, ele seria executado como - nobody , root ...?

Eu examinei /var/run/nginx.pid . O PID registrado lá é 2146 , ou seja, 1 LESS do que o relatado acima e quando eu executo netstat -anp | grep 80 .

Eu tentei esta última etapa várias vezes - várias reinicializações - sempre com o mesmo resultado. Naturalmente, isso significa que as tentativas subseqüentes de recarregar ou interromper o Nginx via service nginx reload e service nginx stop falharam: WRONG PID!

Quando editei manualmente /var/run/nginx.pid para garantir que ela tenha as PID certas funcionando conforme o esperado.

Tenho que admitir que estou trabalhando além do meu conhecimento de como esses assuntos funcionam aqui. Eu apreciaria muito qualquer ajuda para corrigir os problemas que encontrei aqui.

    
por DroidOS 03.12.2015 / 17:24

1 resposta

1

Estou postando a resposta aqui na esperança de que isso salvará outras pessoas das horas de frustração que tive que suportar. O problema mais fácil de lidar aqui é o usuário nobody do qual falo acima. Isso acontece simplesmente porque o arquivo nginx.conf criado por openresty - veja

/usr/local/openresty/nginx/conf/nginx.conf

não se incomoda em especificar um usuário. Basta editar a primeira linha

#user nobody , por isso, lê user www-data www-data e esse problema específico é classificado.

O segundo problema é o script init.d . Receio que a documentação aberta tenha de assumir a culpa aqui. Eles se esforçam para explicar como se tornar openresty & amp; como compilá-lo. Algumas palavras sobre como daemonizá-lo não teriam sido erradas.

Depois de horas tateando no escuro eu pensei em procurar por openresty init.d . O primeiro resultado que surgiu foi este . Eu estou reproduzindo esse script abaixo

#!/bin/sh


PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Nginx Daemon"
NAME=nginx
PREFIX=/usr/local/openresty/nginx
DAEMON=$PREFIX/sbin/$NAME
CONF=$PREFIX/conf/$NAME.conf
PID=$PREFIX/logs/$NAME.pid
SCRIPT=/etc/init.d/$NAME

. /lib/lsb/init-functions

if [ ! -x "$DAEMON" ] || [ ! -f "$CONF" ]; then
 echo -e "3[33m $DAEMON has no permission to run. 3[0m"
 echo -e "3[33m Or $CONF doesn't exist. 3[0m"
 sleep 1
 exit 1
fi

do_start() {
 if [ -f $PID ]; then
    echo -e "3[33m $PID already exists. 3[0m"
    echo -e "3[33m $DESC is already running or crashed. 3[0m"
    echo -e "3[32m $DESC Reopening $CONF ... 3[0m"
    $DAEMON -s reopen -c $CONF
    sleep 1
    echo -e "3[36m $DESC reopened. 3[0m"
 else
    echo -e "3[32m $DESC Starting $CONF ... 3[0m"
    $DAEMON -c $CONF
    sleep 1
    echo -e "3[36m $DESC started. 3[0m"
 fi
}

do_stop() {
 if [ ! -f $PID ]; then
    echo -e "3[33m $PID doesn't exist. 3[0m"
    echo -e "3[33m $DESC isn't running. 3[0m"
 else
    echo -e "3[32m $DESC Stopping $CONF ... 3[0m"
    $DAEMON -s stop -c $CONF
    sleep 1
    echo -e "3[36m $DESC stopped. 3[0m"
 fi
}

do_reload() {
 if [ ! -f $PID ]; then
    echo -e "3[33m $PID doesn't exist. 3[0m"
    echo -e "3[33m $DESC isn't running. 3[0m"
    echo -e "3[32m $DESC Starting $CONF ... 3[0m"
    $DAEMON -c $CONF
    sleep 1
    echo -e "3[36m $DESC started. 3[0m"
 else
    echo -e "3[32m $DESC Reloading $CONF ... 3[0m"
    $DAEMON -s reload -c $CONF
    sleep 1
    echo -e "3[36m $DESC reloaded. 3[0m"
 fi
}

do_quit() {
 if [ ! -f $PID ]; then
    echo -e "3[33m $PID doesn't exist. 3[0m"
    echo -e "3[33m $DESC isn't running. 3[0m"
 else
     echo -e "3[32m $DESC Quitting $CONF ... 3[0m"
     $DAEMON -s quit -c $CONF
     sleep 1
     echo -e "3[36m $DESC quitted. 3[0m"
  fi
}

do_test() {
 echo -e "3[32m $DESC Testing $CONF ... 3[0m"
 $DAEMON -t -c $CONF
}

do_info() {
 $DAEMON -V
}

case "$1" in
 start)
  do_start
  ;;
 stop)
  do_stop
  ;;
 reload)
  do_reload
  ;;
 restart)
  do_stop
  do_start
  ;;
status)
    status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
 quit)
  do_quit
  ;;
 test)
  do_test
  ;;
 info)
  do_info
  ;;
 *)
  echo "Usage: $SCRIPT {start|stop|reload|restart|quit|test|info}"
  exit 2
  ;;
 esac

 exit 0

Uma omissão no script original que eu corrigi - não havia o método status .

    
por DroidOS 03.12.2015 / 22:04