Запуск Redis в демонизированной форме и использование Upstart для управления им не работает



Я написал сценарий выскочки для Redis следующим образом:



description "Redis Server"

start on runlevel [2345]
stop on shutdown
expect daemon

exec sudo -u redis /usr/local/bin/redis-server /etc/redis/redis.conf

respawn
respawn limit 10 5


Затем я настраиваю redis через его redis.conf to:



daemonize yes


Вся документация и мои собственные эксперименты говорят, что Redis дважды разветвляется в демонизированной форме и "ожидаемый демон" должен работать, но сценарий Upstart всегда держится за PID бывшего родителя (PID - 1). У кого-нибудь это работает?
639   2  

2 ответов:

Другие люди имеют те же проблемы. Смотрите эту суть.

Когда активирована опция daemonize, Redis не проверяет, является ли процесс уже демоном (нет вызова getppid). Он систематически разветвляется, но только один раз. Это несколько необычно, другие механизмы демонизации могут потребовать первоначальной проверки на getppid, и fork должен быть вызван дважды (до и после вызова setsid), но в Linux это строго не требуется.

Смотрите этот faq Подробнее информация о демонизации.

Функция Redis daemonize чрезвычайно проста:

void daemonize(void) {
    int fd;

    if (fork() != 0) exit(0); /* parent exits */
    setsid(); /* create a new session */

    /* Every output goes to /dev/null. If Redis is daemonized but
     * the 'logfile' is set to 'stdout' in the configuration file
     * it will not log at all. */
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        if (fd > STDERR_FILENO) close(fd);
    }
}

Документация Upstart гласит:

expect daemon
Specifies that the job's main process is a daemon, and will fork twice after being run.
init(8) will follow this daemonisation, and will wait for this to occur before running
the job's post-start script or considering the job to be running.
Without this stanza init(8) is unable to supervise daemon processes and will
believe them to have stopped as soon as they daemonise on startup.

expect fork
Specifies that the job's main process will fork once after being run. init(8) will
follow this fork, and will wait for this to occur before running the job's post-start
script or considering the job to be running.
Without this stanza init(8) is unable to supervise forking processes and will believe
them to have stopped as soon as they fork on startup.

Поэтому я бы либо деактивировал демонизацию на стороне Redis, либо попытался использовать expect fork вместо expect daemon в конфигурации upstart.

Следующая конфигурация upstart, кажется, работает для меня, с upstart 1.5 на ubuntu 12.04, с redis.conf daemonize установить в yes:

description "redis server"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown

setuid redis
setgid redis
expect fork

exec /opt/redis/redis-server /opt/redis/redis.conf

respawn

Comments

    Ничего не найдено.