Единорог сохраняет тот же PID, когда получает USR2?
Итак, я играл с развертыванием единорога на моем личном сервере. Это объясняется множеством причин, одна из которых заключается в том, что мне не особо хотелось собирать собственную версию nginx, чтобы получить пассажира фьюжн. (Мне нравится иметь вещи с управлением пакетами.)
Несмотря на это, единорог демонстрирует странное поведение. Когда вы отправляете Unocorn сигнал USR2, он должен по сути выполнять горячую замену, копируя свой файл pid из unicorn.pid в unicorn.pid.oldbin. Я настроил свой файл unicorn.rb так, чтобы, если он обнаружит указанный unicorn.pid.oldbin при запуске, он запускает старый процесс QUIT - точно так же, как я должен.
Тем не менее, это не работает, потому что ни один из pid не меняется. Итак, либо Unicorn наследует тот же PID - либо что-то не так.
Ниже приведен список мастеров Unicorn. Я не впечатляюсь чтением системных вызовов - но я не вижу, чтобы здесь что-то выскакивало. Может ли кто-нибудь взглянуть на это и сказать мне, что мне не хватает? Спасибо!
Process 32177 attached - interrupt to quit
select(6, [5], NULL, NULL, {20, 476644}) = ? ERESTARTNOHAND (To be restarted)
--- SIGUSR2 (User defined signal 2) @ 0 (0) ---
sigreturn() = ? (mask now [])
fcntl64(6, F_GETFL) = 0x1 (flags O_WRONLY)
fcntl64(6, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
write(6, ".", 1) = 1
select(6, [5], NULL, NULL, {10, 814939}) = 1 (in [5], left {10, 814936})
fcntl64(5, F_GETFL) = 0 (flags O_RDONLY)
fcntl64(5, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
read(5, ".", 11) = 1
waitpid(-1, 0xbf987ee4, WNOHANG) = 0
open("/www/web/tmp/unicorn.pid.oldbin", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
open("/www/web/tmp/unicorn.pid", O_RDONLY|O_LARGEFILE) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777c000
_llseek(4, 0, [0], SEEK_CUR) = 0
read(4, "32177\n", 4096) = 6
read(4, "", 4096) = 0
close(4) = 0
munmap(0xb777c000, 4096) = 0
unlink("/www/web/tmp/unicorn.pid") = 0
open("/www/web/tmp/0.0132033250636285.32177", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fcntl64(4, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777c000
_llseek(4, 0, [0], SEEK_CUR) = 0
write(4, "32177\n", 6) = 6
rename("/www/web/tmp/0.0132033250636285.32177", "/www/web/tmp/unicorn.pid.oldbin") = 0
close(4) = 0
munmap(0xb777c000, 4096) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb74939d8) = 32184
waitpid(-1, 0xbf987ee4, WNOHANG) = 0
gettimeofday({1312941623, 777508}, NULL) = 0
gettimeofday({1312941623, 777684}, NULL) = 0
select(6, [5], NULL, NULL, {26, 0}) = ? ERESTARTNOHAND (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
sigreturn() = ? (mask now [])
fcntl64(6, F_GETFL) = 0x801 (flags O_WRONLY|O_NONBLOCK)
write(6, ".", 1) = 1
select(6, [5], NULL, NULL, {25, 595766}) = 1 (in [5], left {25, 595763})
fcntl64(5, F_GETFL) = 0x800 (flags O_RDONLY|O_NONBLOCK)
read(5, ".", 11) = 1
waitpid(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], WNOHANG) = 32184
gettimeofday({1312941624, 183506}, NULL) = 0
write(2, "reaped #<Process::Status: pid=32"..., 57) = 57
open("/www/web/tmp/unicorn.pid", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
open("/www/web/tmp/unicorn.pid.oldbin", O_RDONLY|O_LARGEFILE) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777c000
_llseek(4, 0, [0], SEEK_CUR) = 0
read(4, "32177\n", 4096) = 6
read(4, "", 4096) = 0
close(4) = 0
munmap(0xb777c000, 4096) = 0
unlink("/www/web/tmp/unicorn.pid.oldbin") = 0
open("/www/web/tmp/0.712879319799392.32177", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fcntl64(4, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777c000
_llseek(4, 0, [0], SEEK_CUR) = 0
write(4, "32177\n", 6) = 6
rename("/www/web/tmp/0.712879319799392.32177", "/www/web/tmp/unicorn.pid") = 0
close(4) = 0
munmap(0xb777c000, 4096) = 0
waitpid(-1, 0xbf987ee4, WNOHANG) = 0
gettimeofday({1312941624, 186901}, NULL) = 0
gettimeofday({1312941624, 187058}, NULL) = 0
select(6, [5], NULL, NULL, {25, 0}^C <unfinished ...>
Process 32177 detached
2 ответа
Я нашел решение этой проблемы.
Оказывается, в моем лог-файле были пропущены сообщения, указывающие на сбой процесса запуска нового дочернего элемента. Причина этой неудачи в том, что я не объявил единорога в своем Gemfile.
По какой-то причине кажется, что можно запустить единорога из командной строки без единорога, существующего в Gemfile, но Unicorn не может запустить себя без упоминания в Gemfile.
Я хотел бы услышать объяснение этого от кого-то, кто знает, почему это так, но в настоящее время моя проблема была решена. Я могу успешно ездить на велосипеде единорога.
Я имел дело со связанной проблемой, и мы все еще прорабатываем ее в списке рассылки: http://rubyforge.org/pipermail/mongrel-unicorn/2011-August/001081.html