Запуск Redis в демонизированной форме и использование Upstart для управления им не работает - PullRequest
5 голосов
/ 30 декабря 2011

Я написал сценарий 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:

daemonize yes

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

Ответы [ 2 ]

6 голосов
/ 30 апреля 2012

Следующая конфигурация 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
3 голосов
/ 30 декабря 2011

У других людей такая же проблема.См. this gist .

Когда опция 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, либо попробуйте использовать ожидаемый форк, чем ожидаемый демон в конфигурации upstart.

...