Ruby后台进程STDOUT为空

时间:2011-06-27 14:55:37

标签: ruby-on-rails ruby bash sysv

我遇到一个奇怪的问题,一个启动脚本使用shell的“守护进程”函数运行Sinatra脚本。问题是当我在命令行运行命令时,我得到输出到STDOUT。如果我在命令行中完全按照脚本中的命令运行命令 - 减去守护程序部分 - 输出正确地重定向到输出文件。但是,当启动脚本运行它时(见下文),我会收到STDERR日志但不会收到STDOUT日志。

剧本的相关部分:

#!/bin/sh
# (which is and has been a symlink to /bin/bash

# Source function library.
. /etc/init.d/functions

# Set Some Variables
RUNAS="joeuser"
PID=/var/run/myapp.pid
LOG="/var/log/myapp/app-out.log"
ERR_LOG="/var/log/myapp/app-err.log"
APPLICATION_COMMAND="RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 2>>${ERR_LOG} >>${LOG} &"

# Snip a bunch. This is the applicable line from the "start" case:
daemon --user $RUNAS --pidfile $PID $APPLICATION_COMMAND &> /dev/null

现在,时髦的部分:

  • 通过STDERR的重定向正确写入错误日志。
  • 如果我颠倒>>的顺序并且2>> (我正抓住稻草,在这里!),行为没有改变:我仍然正确地记录STDERR并且STDOUT是空的。
  • 如果输出日志不存在,则STDOUT重定向将创建该文件。但是,该文件仍然是0长度。
  • 这曾经工作过。日志目录由log-rotate维护。所有最近的'out'日志都是0长度。较旧的不是。好像它在四月停止工作了一段时间。红宝石代码在此时间的任何时候都没有变化;启动脚本也没有。

我们以这种方式运行三种不同的服务。其中两个是ruby守护进程(一个使用sinatra,一个不使用),另一个是后台java进程。对于ruby进程来说,这种情况正在发生,但在java进程中却没有发生。也许在Ruby中发生了一些变化?

FTR,我们有红宝石1.8.5和RHEL 5.4。


我做了更多的探索。 daemon函数做了很多东西,但问题在于它使用runuser运行程序。该命令基本上如下所示:

runuser -s /bin/bash - joeuser -c "ulimit -S -c 0 >/dev/null 2>&1 ; RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 '</dev/null' '>>/var/log/myapp/app-out.log' '2>>/var/log/myapp/app-err.log' '&'"

当我在命令行中完全运行时(无论是否有沿着该行添加的单一刻度),我都得到完全相同的螺旋行为w.r.t.输出日志。那么,在我看来,这是ruby(?)如何与runuser交互的问题?

1 个答案:

答案 0 :(得分:0)

评论太长: - )

更改shebang以添加#!/bin/sh -x并根据您的期望验证所有内容是否已展开。此外,当从终端执行时,你的.bashrc文件来源,当从脚本执行时,它不是;可能是你环境中有所不同的东西。找到答案的一种方法是从终端和脚本执行env并对输出进行区分

  • env > env_terminal
  • env > env_script
  • diff env_terminal env_script

快乐狩猎......