Запуск 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). У кого-нибудь это работает?
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