1

我正在尝试使用Bundler使用Supervisord设置Kibana。使用 Bundler 安装 Kibana 依赖项完全没有问题。我试着跑步,它奏效了。我还尝试在查看在 htop 中生成的进程时使用 Ctrl-C 杀死它,并且它起作用了。bundle exec ruby kibana.rb

但是,当使用 supervisord(或类似 SIGINT 或 SIGTERM 之类的信号)杀死 bundler 时,由它产生的两个孩子会存活下来。因此,如果在 supervisord 中重新启动 kibana 作业,则重新启动将失败,因为重新启动的作业将尝试分配的端口已在使用中。

据我所知,bundler exec 不应该分叉,据我所知,它不会。当它收到信号时,它的行为并不像我预期的那样。

我能做些什么?从捆绑器切换可能是一个解决方案,但它是不可取的。

4

1 回答 1

0

我解决了。我在下面写了一个小的 run_kibana bash 助手(在另一个Stack Overflow 线程中找到):

function kill_kibana() {
  echo "Trapped termination of Kibana subprocessess"
  pkill -TERM -P $1
}

bundle exec ruby kibana.rb &
pid=$!
trap "kill_kibana $pid" SIGINT SIGTERM SIGKILL SIGQUIT
wait $pid

它就像一个魅力。扩展它以发送被捕获在 kill_kibana() 函数中的实际信号可能是合理的。

于 2013-01-15T09:52:18.133 回答