Сервис Ubuntu, запущенный с/etc/init.d, заканчивает с неправильным PID

Этот вопрос следует за моим предыдущим вопросом. Резюмировать

  • Я хочу использовать OpenResty, а не ванильный Nginx на моем сервере Ubuntu 14.04.
  • Я соответствовал OpenResty, следующий инструкциям здесь.
  • Скомпилированный nginx заканчивается в '/usr/local/openresty/nginx/sbin'
  • Я могу теперь сделать ./nginx от той папки для запуска nginx.

Проблема состоит в том, что у меня должна быть способность сделать материал как service nginx status|reload|start|stop поскольку я обычно делал бы, если бы я использовал ванильную версию Nginx, установленного через apt-get install nginx|nginx-extras и т.д.

Мои знания таких проблем являются довольно элементарными. Однако посредством взламывания /etc/init.d/nginx сценарий, который создается apt-get install nginx и изменяя идеи, описанные здесь, я создал свое собственное /etc/init.d/nginx сценарий, который я воспроизвожу ниже

#!/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

С этим на месте, если я перезагружаю свой сервер и проблему a lsof -nP -i | grep LISTEN Я получаю вывод

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

Одна из вещей я не понимаю здесь - почему два users:root и никто? Таким образом, если бы я посетил сервером из браузера и выполнил Сценарий PHP, то он был бы выполнен как - никто, базировался бы...?

Я исследовал /var/run/nginx.pid. PID, зарегистрированный там, 2146, т.е. 1 МЕНЬШЕ, чем, о чем сообщают выше и когда я работаю netstat -anp | grep 80.

Я несколько раз пробовал этот последний шаг по - несколько перезагрузок - со всегда тем же результатом. Естественно, это означало что последующие попытки перезагрузить или остановить Nginx через service nginx reload и service nginx stop отказавший: НЕПРАВИЛЬНЫЙ PID!

Когда я вручную отредактировал /var/run/nginx.pid гарантировать, что это имеет правильные вещи PID работа как ожидалось.

Я должен признать, что работаю вне своего знания того, как такие вопросы работают здесь. Я был бы очень признателен за любую справку, устраняющую проблемы, с которыми я столкнулся здесь.

0
задан 13 April 2017 в 15:24

1 ответ

Я отправляю ответ здесь в надежде, что он сохранит других часы разочарования, которое я должен был вынести. Легкая проблема для рассматриваний здесь nobody пользователь, о котором я говорю выше. Это происходит вполне просто, потому что nginx.conf файл, созданный openresty - видит

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

, не потрудился определять пользователя. Просто отредактируйте первую строку

#user nobody, таким образом, она читает user www-data www-data и что конкретный вопрос отсортирован.

второй выпуск init.d сценарий. Я боюсь, что openresty документация должна взять вину здесь. Они переходят к некоторым длинам, чтобы объяснить, как получить openresty & как скомпилировать его. Несколько слов о том, как к daemonize это не потерялось бы.

После часов блуждания в темноте я думал о поиске openresty init.d. Самый первый результат, который подошел, был этот . Я воспроизвожу тот сценарий ниже

#!/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 "\033[33m $DAEMON has no permission to run. \033[0m"
 echo -e "\033[33m Or $CONF doesn't exist. \033[0m"
 sleep 1
 exit 1
fi

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

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

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

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

do_test() {
 echo -e "\033[32m $DESC Testing $CONF ... \033[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

пропуск в исходном сценарии, который я исправил - не было никакого status метод.

1
ответ дан 26 July 2019 в 13:34

Другие вопросы по тегам:

Похожие вопросы: