在Capistrano 2.x中,您可以使用
逐行捕获输出run "ls -la" do |channel, stream, data|
puts data
end
这在Capistrano 3.x中不起作用,capture
和execute
命令似乎没有提供相同的功能。
有没有办法在3.x中复制2.x行为?
答案 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"
输出将自动流式传输,非常适合流式传输日志文件等。