最近在 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)