Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Unicorn在USR2和退出信号后停机几秒钟(不应)_Ruby_Capistrano_Unicorn - Fatal编程技术网

Ruby Unicorn在USR2和退出信号后停机几秒钟(不应)

Ruby Unicorn在USR2和退出信号后停机几秒钟(不应),ruby,capistrano,unicorn,Ruby,Capistrano,Unicorn,我有一个与独角兽非常基本的应用程序。Rails 5.1应用程序只需回显/打印“Hello World”。对于测试,我给了4名工人 unicorn.rb: worker_processes 4 preload_app true timeout 30 listen '127.0.0.1:3000', :tcp_nopush => true, :backlog => 4096 # Logging ... 现在,我向主进程发送USR2信号。主进程成功接收到我的信号并创建了另一个主进程,然

我有一个与独角兽非常基本的应用程序。Rails 5.1应用程序只需回显/打印“Hello World”。对于测试,我给了4名工人

unicorn.rb:

worker_processes 4
preload_app true

timeout 30
listen '127.0.0.1:3000', :tcp_nopush => true, :backlog => 4096
# Logging
...
现在,我向主进程发送
USR2
信号。主进程成功接收到我的信号并创建了另一个主进程,然后将其标记为“旧”,并将PID写入
oldbin
文件

问题从这里开始。当我确保创建了第二个母版及其子版时,我会将
QUIT
发送到old母版。问题就在这里。当旧主机接收到退出时,整个新主机和旧主机及子机将被删除并重新创建。这使我的系统停机几秒钟

基本上,新主人杀死自己,然后重新创造。为什么?我做错了什么?我以为这是零停机时间。我可以向你保证我有3-5秒的停机时间

我检查过了,旧主控器创建了PID为5的新主控器(例如),其子控器为6、7、8、9。当我从旧的那个退出时,新的主人变成了10个,工人变成了11,12,13,14个。简单地显示旧的和新的都退出并重新创建

我不使用
-D
命令。我使用foreman生成
systemd
文件,如下所示:

[Unit]
PartOf=bp-web.target

[Service]
User=Pratha
WorkingDirectory=/var/www/app/releases/20170628140005
Environment=PORT=%i
ExecStart=/bin/bash -lc 'exec bundle exec unicorn -E production -c config/unicorn.rb'
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=mixed
TimeoutStopSec=5
  • 我使用capistrano进行发布周期和部署
  • 如果我将puma与线程(甚至16个工作线程50个线程)一起使用,我将获得真正的“零停机时间”

  • 这是一种预期行为:

    Supervisord要求unicorn进程不进行后台监控。同时向独角兽发送SIGUSR2会导致老主人死亡。由于监控器监视旧的主机<强>这将使它考虑应用程序退出< /强>,即使它正在运行一个新的进程ID。<强>最后监督者将尝试重新启动应用程序,并且不这样做,因为所有的套接字都被新的独角兽主机使用。<强/ > /p> 解决方案:

  • 使用-D选项并在没有systemd/supervisord的情况下自己启动unicorn rails应用程序。那么USR2就可以工作了
  • 或者用独角兽做包装。这将为你做这项工作。没有停机时间
  • 见链接: