Итак, я играл с развертыванием единорога на моем личном сервере. Этому есть множество причин, одна из которых заключалась в том, что я не особо хотел компилировать свою собственную версию nginx, чтобы получить пассажира phusion. (Мне нравится управлять пакетами.)
Тем не менее, единорог ведет себя странно. Когда вы отправляете 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
Я нашел решение этой проблемы.
Оказалось, что были сообщения, которые я пропустил в моем файле журнала, которые указывали, что процесс запуска нового дочернего элемента не удался. Причина этой неудачи в том, что я не объявил единорога в моем Gemfile.
По какой-то причине кажется, что можно запустить unicorn из командной строки без единорога, существующего в Gemfile, но Unicorn не может запустить себя без упоминания в Gemfile.
Я хотел бы услышать объяснение этого от кого-то, кто знает, почему это так, но в настоящее время моя проблема решена. Я могу успешно ездить на единороге.
Я занимался связанной проблемой, и мы все еще работаем над ней в списке рассылки: http://rubyforge.org/pipermail/mongrel-unicorn/2011-August/001081.html