新手问题 还是 rails 中执行 shell 脚本遇到的问题

fsword · 2012年08月22日 · 最后由 fsword 回复于 2012年08月22日 · 4161 次阅读

最近在 apposs 上添加了执行平台上脚本的功能,这个脚本纯粹就是一个 shell 命令,但是不知道为什么总是遇到进程返回码不为 0 的情况,相关代码如下:

def exec_command
  pid = Process.fork
  if pid.nil?
    Bundler.with_clean_env do
      Rails.logger.info "exec command: #{self.command_name}"
      body = `#{self.command_name}`
      result = $?.success?
      Rails.logger.info "exec result: #{body} - #{result}"
      self.callback result,(body||'')
    end
  else
    Process.waitpid pid
  end
end

线上运行的时候日志输出为——

exec command: cd /home/lifu/projects/2012-08-22_19-20-48/private/data/2494/11/target && brakeman --summary 2>&1
exec result: [Notice] Detected Rails 3 application
stty: standard input: Inappropriate ioctl for device
/home/lifu/.rvm/gems/ruby-1.9.2-p290/gems/brakeman-1.7.1/lib/brakeman/util.rb:353:in `>': comparison of Fixnum with nil failed (ArgumentError)

而相应的命令在线上服务器环境上是运行成功的

$ cd /home/lifu/projects/2012-08-22_19-20-48/private/data/2494/11/target && brakeman --summary
......省略输出
$ echo $?
0

我不理解为什么在 rails 中执行结果会失败 (补充:问题应该仅仅和这个函数有关,不过如果需要了解其它代码,我也更新到了 github 上: https://github.com/taobao/apposs-center/commit/1d90fa6176385e7ecd1b343dfb0755161e33f921

朋友说可能跟 pipe 冲突有关,待分析

awesome...什么是 pipe 冲突

#2 楼 @hooopo 这里有一个 fork,涉及到进程间 io 共享的问题,别的我也不懂了,正在 google

试试 运行时加上 2>&1 在看返回值 我猜主要出在 bash 的 env 因为,你在当前 teminal 下的 bash env 不等于 `` 运行时的 bash env, 最好把 env 打印出来 diff 一下

#4 楼 @alvin2ye 本来是有的,发帖时遗漏了 env 差别不大,我直接在服务器上用同一个会话执行效果也一样,估计还是管道的问题

需要 登录 后方可回复, 如果你还没有账号请 注册新账号