PHP-скрипт как демон в Debian

Кажется, я не могу найти ничего, что делало бы именно это, и я потратил 2 часа на поиск решения в Google, и я просто сыт по горло. Я уверен, что это простое решение, но я не могу его найти.

Мне нужно запустить файл .php, расположенный в /var/www/Game/Sockets/ChatServer.php, в качестве демона. Этот файл действует как Socket Server для моей системы чата в моей браузерной игре. Однако, несмотря на то, что я пробовал много разных вещей, я не могу запустить его при загрузке. Я могу использовать "service ChatServerDaemon start" для запуска демона, но при загрузке он не работает. Файл, который я нашел в init.d:

#! /bin/sh

# Installation
# - Move this to /etc/init.d/myservice
# - chmod +x this
#
# Starting and stopping
# - Start: `service myservice start` or `/etc/init.d/myservice start`
# - Stop: `service myservice stop` or `/etc/init.d/myservice stop`

#ref http://till.klampaeckel.de/blog/archives/94-start-stop-daemon,-Gearman-and-a-    little-PHP.html
#ref http://unix.stackexchange.com/questions/85033/use-start-stop-daemon-for-a-php-    server/85570#85570
#ref http://serverfault.com/questions/229759/launching-a-php-daemon-from-an-lsb-init-    script-w-start-stop-daemon

NAME=ChatServerDaemon
DESC="Chat Server Daemon for Taloren."
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"

DAEMON="/usr/bin/php"
DAEMON_OPTS="/var/www/Game/Sockets/ChatServer.php"

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON}         ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"

test -x $DAEMON || exit 0

set -e

case "$1" in
    start)
    echo -n "Starting ${DESC}: "
    start-stop-daemon $START_OPTS >> $LOGFILE
    echo "$NAME."
    ;;
stop)
    echo -n "Stopping $DESC: "
    start-stop-daemon $STOP_OPTS
    echo "$NAME."
    rm -f $PIDFILE
    ;;
restart|force-reload)
    echo -n "Restarting $DESC: "
    start-stop-daemon $STOP_OPTS
    sleep 1
    start-stop-daemon $START_OPTS >> $LOGFILE
    echo "$NAME."
    ;;
*)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0

Я разозлился и устал пытаться заставить это работать. Пожалуйста, помогите мне с этим. Извините, если ответ очевиден. :/


person Marcus Krueger    schedule 11.05.2014    source источник
comment
Вы просто хотите запустить задание только при запуске или хотите возродить его и при выходе?   -  person Abhineet Verma    schedule 16.06.2014


Ответы (1)


Просто поместить скрипт в /etc/init.d/ недостаточно, чтобы он запускался при загрузке. Нужно указать, на каких уровнях запуска система должна запускать или останавливать службу. В дистрибутивах, использующих классическую систему инициализации SysV, это делается путем создания символических ссылок на скрипт инициализации в специальных папках.

Вот кому определить текущий уровень запуска:

$ who -r
     run-level 2  Apr  9 10:39                   last=S

Например, вот как была настроена служба печати cups для запуска на уровне выполнения 2:

$ ls -l /etc/rc2.d/S20cups
lrwxrwxrwx 1 root root 14 Apr  6 01:24 /etc/rc2.d/S20cups -> ../init.d/cups

Все, что должно быть запущено или остановлено на уровне выполнения 2, имеет символ в /etc/rc2.d/, имя символической ссылки начинается с S, когда служба должна быть запущена, и K, когда служба должна быть остановлена, тогда есть двухзначный приоритет.

Это может быть неудобно делать вручную, поэтому в основных дистрибутивах есть инструменты для автоматического выполнения этой задачи. В Debian или Ubuntu это update-rc.d. В RedHat это chkconfig.

Также эта система инициализации SysV заменяется системой systemd (которая по-прежнему поддерживает сценарии инициализации SysV). Так что, возможно, стоит написать непосредственно файл конфигурации для systemd. Или вы можете использовать альтернативный диспетчер служб, например supervisord или god. Ими намного проще управлять, и у них есть приятные функции, такие как автоматический перезапуск служб в случае сбоя.

person Grapsus    schedule 11.05.2014