如何获取使用IO.popen调用的命令的退出状态?

Jor*_*son 9 ruby

我正在使用IO.popen执行命令并捕获输出,如下所示:

process = IO.popen("sudo -u service_user -i start_service.sh") do |io|
    while line = io.gets
      line.chomp!
      process_log_line(line)
    end
  end
Run Code Online (Sandbox Code Playgroud)

如何捕获*start_service.sh*的退出状态?

Jor*_*son 12

您可以通过引用$来捕获通过IO.open()调用的命令的退出状态.只要您在块的末尾关闭了管道.

在上面的示例中,您将执行以下操作:

  process = IO.popen("sudo -u service_user -i start_service.sh") do |io|
    while line = io.gets
      line.chomp!
      process_log_line(line)
    end
    io.close
    do_more_stuff if $?.to_i == 0 
  end
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅IO.popen的Ruby Core Library条目.

  • 你通常想要的是进程的退出代码,而不是*stat*的整数表示.所以你应该使用`$?.exitstatus`而不是`$?.to_i`,参见http://www.ruby-doc.org/core-2.1.5/Process/Status.html.或者只是使用`$?.success?`如果你不需要非零退出代码的值. (5认同)
  • 第二个@bibstha,您必须在检查“$?”之前调用“io.close”,否则“$?.to_i”将始终为零,因为“nil.to_i”始终为零。为了安全起见,请确保使用 `$?.exitstatus` 或 `$?.success?` 而不是 `$?.to_i == 0` (2认同)