使用Capistrano 3执行'tail -f'不会输出任何内容

时间:2014-03-21 12:43:53

标签: ruby capistrano tail

我的Capistrano任务看起来像这样:

desc "tail log file"
task :tail do
  on roles(:app) do
    execute "tail -f #{shared_path}/log/#{fetch(:log_file)}.log"
  end
end

当我运行任务时,它继续阻塞tail -f请求,但它什么也没显示。我百分之百肯定它不会以某种方式管道数据(我已经验证了它 - 日志文件在遥控器上更新)因此它什么都没显示。我错过了什么? app角色包含在舞台配置中。

3 个答案:

答案 0 :(得分:0)

Mmmmmmm ...,检查文件系统中的权限。运行任务的用户应具有读取文件的权限。

您可以尝试chmod o + r logfile.log

在这里,您可以向该文件上的任何人提供读取权限(用于调试目的)。

答案 1 :(得分:0)

我找到了解决问题的解决方法/解决方案。我不记得我在哪里找到了解决方案,但是通过使用伪tty强制分配实例化ssh连接来执行命令 rawly -t让它工作。这将获得tail -f之类的阻止请求。正如man页面上-t选项所述:

  

这可用于在远程计算机上执行任意基于屏幕的程序,                这可能非常有用......

def execute_interactively(command)
  user = fetch(:user)
  port = fetch(:port)
  cmd = "ssh -l #{user} #{host} -p #{port} -t 'cd #{deploy_to}/current && #{command}'"
  exec cmd
end

答案 2 :(得分:0)

您需要将capistrano详细级别设置为DEBUG以查看任何流式输出。我在capistrano3-taillog宝石中找到了解决方案;见taillog.cap

desc "tail log file"
task :tail do
  on roles(:app) do
    with_verbosity Logger::DEBUG do
      execute "tail -f #{shared_path}/log/#{fetch(:log_file)}.log"
    end
  end
end

def with_verbosity(output_verbosity)
  old_verbosity = SSHKit.config.output_verbosity
  begin
    SSHKit.config.output_verbosity = output_verbosity
    yield
  ensure
    SSHKit.config.output_verbosity = old_verbosity
  end
end