独角兽工人无故死亡

ele*_*nts 5 ruby ruby-on-rails nginx unicorn

所有的独角兽工人都在默默地死去,没有任何原因的迹象,而且我找不到任何外部过程杀死他们的证据。我是刚开始诊断这类问题的人,经过数小时的研究,实验并试图弄清楚这一点,我已经走到了尽头。

背景信息-它是一个Rails 4.1应用程序,Ruby 2.0,在Ubuntu 14.04服务器上运行nginx和unicorn。

独角兽

working_directory "/home/deployer/apps/ourapp/current"
pid "/home/deployer/apps/ourapp/current/tmp/pids/unicorn.pid"
stderr_path "/home/deployer/apps/ourapp/current/log/unicorn.log"
stdout_path "/home/deployer/apps/ourapp/current/log/unicorn.log"

listen "/tmp/unicorn.ourapp.sock"
worker_processes 2
timeout 30
Run Code Online (Sandbox Code Playgroud)

摘自unicorn.log(死前和重启后的最后几行)

I, [2016-08-28T19:54:01.685757 #19559]  INFO -- : worker=1 ready
I, [2016-08-28T19:54:01.817464 #19556]  INFO -- : worker=0 ready
I, [2016-08-29T09:19:14.818267 #30343]  INFO -- : unlinking existing socket=/tmp/unicorn.ourapp.sock
I, [2016-08-29T09:19:14.818639 #30343]  INFO -- : listening on addr=/tmp/unicorn.ourapp.sock fd=10
I, [2016-08-29T09:19:14.818807 #30343]  INFO -- : worker=0 spawning...
I, [2016-08-29T09:19:14.824358 #30343]  INFO -- : worker=1 spawning...
Run Code Online (Sandbox Code Playgroud)

一些相关信息:

  • 经过约8至20个小时的时间后,独角兽死亡。
  • 独角兽日志中没有记录任何错误。
  • 我搜索了所有/var/log被杀死进程的证据,只能找到几天前被杀死的一个不相关进程。
  • New Relic显示上一次随机关闭之前的内存使用情况平坦,红宝石使用了大约400mb。目前它的大小为480mb,没有问题,因此我认为它没有遇到内存限制。
  • 与CPU使用率相同...红宝石在死之前徘徊在0.1%左右。
  • 它死亡的最后几次是在深夜。仅有的请求来自New Relic和Linode Longview监视。
  • 我们的production.log显示了在死于New Relic之前的最后一个请求。它Completed 200 OK in 264ms所以它似乎并没有被请求超时。
  • 登台过程中也发生了这种情况,并且日志级别设置为调试,登台日志中没有其他线索。

问题:

  • 是什么杀死了不是内存不足管理器或关闭信号的独角兽工人?
  • 可能是OOM还是关闭信号,并且正在某个我不想看的地方录制它,或者由于某种原因而没有录制?
  • 有没有一种方法可以更详细地捕获独角兽遇到的问题?

我不知道从这里去哪里,所以任何建议将不胜感激。

更新

正如建议的那样,我使用strace来发现独角兽被以前的开发人员添加的旧crontab(我应该早点检查过)杀死了,该crontab打算每晚重新启动服务器。停止命令有效,但是启动命令失败。

我仍然不知道为什么我无法在日志搜索中找到任何内容,但是在将strace附加到主要的独角兽进程(使用诸如strace -o /tmp/strace.out -s 2000 -fp <unicorn_process_id>)之后,strace日志以clear结尾 +++ killed by SIGKILL +++。我再次搜索了日志,这使我进入了crontab。

根本原因可能是非常具体的,以我的情况,但我真的很高兴,我知道现在strace的。