使用God监控Unicorn - 启动时出现非零代码 = 1

42

我正在编写一个God脚本来监控我的独角兽。我从GitHub的示例脚本开始,并进行了修改以匹配我的服务器配置。一旦God正在运行,例如god stop unicorngod restart unicorn之类的命令就可以正常工作。

然而,god start unicorn会导致WARN: unicorn启动命令以非零代码=1退出。奇怪的是,如果我直接从配置文件中复制启动脚本,它就像全新的野马一样启动。

这是我的启动命令:

/usr/local/bin/unicorn_rails -c /home/my-linux-user/my-rails-app/config/unicorn.rb -E production -D

我已在配置文件中声明了所有路径为绝对路径。有任何想法可以解决这个脚本无法工作的问题吗?

3个回答

14

我之前没有使用过 Unicorn 作为应用服务器,但我以前用过 God 进行监控。

如果我没记错的话,当你启动 god 并提供配置文件时,它会自动启动你要监控的任何东西。Unicorn 可能已经在运行,这就是为什么它会抛出错误的原因。

可以通过在启动 god 后运行 god status 来检查这一点。如果不是这种情况,可以在命令行上检查命令的退出状态:

/usr/local/bin/unicorn_rails -c /home/my-linux-user/my-rails-app/config/unicorn.rb -E production -D; echo $?;

该 echo 命令将打印上一个命令的退出状态。如果它是零,则表示上一个命令未报告任何错误。尝试连续两次启动 unicorn,我预计第二次将返回 1,因为它已经在运行中了。

编辑:

包括评论中的实际解决方案,因为这似乎是受欢迎的响应:

如果您的进程需要以特定用户的身份运行,则可以设置显式的用户和组。

God.watch do |w|
  w.uid = 'root'
  w.gid = 'root'

  # remainder of config
end

有趣...这是一个非常好的建议。我使用echo添加来读取在god之外执行启动和停止命令的输出。它们都以“0”的值退出。然而,当相同的命令由god执行时,它以“1”的值退出。所有进程都应该作为root启动...无论是god还是独角兽。我想知道是否存在一个全面的权限错误。这似乎是一个合理的答案吗? - mindtonic
1
听起来像是尽管God以root身份运行,但它可能会作为另一个用户执行命令?看起来你可以通过以下方式设置God运行命令的用户: God.watch do |w| ...w.uid = 'root' w.gid = 'root' ... end - Jeremy

0

添加日志选项在调试中帮助了我很多。

God.watch do |w|
  w.log = "#{RAILS_ROOT}/log/god.log"

  # remainder of config
end

最终,我的错误原来是在God中执行的start_scriptdevelopment环境下。我通过将RAILS_ENV附加到启动脚本中来修复了这个问题。
start_script = "RAILS_ENV=#{ENV['RACK_ENV']} bundle exec sidekiq -P #{pid_file} -C #{config_file} -L #{log_file} -d"

0
我的问题是我从来没有以根用户身份执行捆绑操作。以下是我所做的步骤:
sudo bash
cd RAILS_ROOT
bundle

你会收到一个警告,告诉你永远不要这样做:

不要以root身份运行Bundler。如果需要,Bundler可以请求sudo权限, 并且以root身份安装bundle将会破坏该应用程序在此计算机上的所有非root用户。

但这是我唯一能让resque或unicorn与god一起运行的方法。如果有帮助的话,这是在ec2实例上进行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接