Capistrano 3.x逐行捕获输出

时间:2013-10-10 09:02:35

标签: ruby capistrano

在Capistrano 2.x中,您可以使用

逐行捕获输出
run "ls -la" do |channel, stream, data|
    puts data
end

这在Capistrano 3.x中不起作用,captureexecute命令似乎没有提供相同的功能。

有没有办法在3.x中复制2.x行为?

3 个答案:

答案 0 :(得分:14)

output = capture('cat ~/file.cnf')
output.each_line do |line|
    puts line
end

这就是我如何使用捕获来读取线条。如果你想在一行上捕捉特定的东西,你可以使用

if line.include? 'user'

答案 1 :(得分:3)

我无法弄清楚如何在第4章中获得流式传输输出。对于我在Cap 3.4.0中使用sshkit 1.11.1,execute没有这样做。

但是看看sshkit文档,这是破解它的一种方法,哪种方式有效:

class StreamOutputInteractionHandler
  def on_data(_command, stream_name, data, channel)
    $stderr.print data
  end
end

# ...

execute :whatever, interaction_handler: StreamOutputInteractionHandler.new

它可能做奇怪的事情,特别是如果你在多个主机上执行,它当然会交错输出。您可以使用类似于内置MappingInteractionHandler的方式使用capistrano日志,但我想直接打印到控制台,这样我就可以在换行前获得部分输出(来自rake任务的进度条)。

在这里与sshkit维护者讨论。 https://github.com/capistrano/sshkit/issues/395#issuecomment-288489866

答案 2 :(得分:-4)

这在Capistrano 3.x中实际上更简单,你可以这样做:

execute "ls -a"

输出将自动流式传输,非常适合流式传输日志文件等。