【问题标题】:ruby redirect multiple processes output to logruby 将多个进程的输出重定向到日志
【发布时间】:2012-12-28 18:24:49
【问题描述】:

我的 ruby​​ 脚本应该处理多个外部进程,所以我想知道如何将不同进程的输出重定向到不同的日志文件。另外,由于外部过程需要相当长的时间才能完成,并行处理它们的最佳方法是什么?

由于我是 ruby​​ 新手,我可以向您展示一个 shell 等效代码:

LOGDIR="/tmp/test"
for host in $( h1 h2 h3 h4 ); do
  ( ssh root@${host} 'sh /tmp/scripttorun' >> ${LOGDIR}/${host}.log 2>&1 ) &
  sleep 5
done
wait #wait for all subprocesses to complete

【问题讨论】:

  • 对这些“外部过程”的性质进行一些澄清会有所帮助。这些是命令行进程吗?你在打电话休息网址吗?
  • 是的,它们是命令行程序,可以使用 net/ssh 在多个系统上执行。

标签: ruby multithreading file-io


【解决方案1】:

可以使用非常相似的方法将输出重定向到日志文件,使用反引号或%x(如果您选择):

`cp -v some/file/that/does/not/exist some/file/name >> /path/to/stdout.log 2>>/path/to/stderr.log`

如果要在变量中传递值,请使用:

`ssh root@#{host} 'sh /tmp/scripttorun' >> #{LOGDIR}/#{host}.log 2>&1`

不过,这一切都假设您使用的是 SSH 密钥。没有它们,SSH 将无法建立连接,而是会暂停并提示您输入密码,从而导致您的代码挂起。您需要以编程方式使用 Net::SSH gem 来解决这种情况。

要并行处理它们,我建议查看EventMachineEM-SSH

【讨论】:

    【解决方案2】:

    我在 Ruby 中想出的代码如下:

    @pids = []
    hosts = %w(h1 h2 h3 h4)
    hosts.each do |host|
      @pids << Kernel.fork { `ssh root@#{host} 'sh /tmp/test' >> #{LOGDIR}/#{host}.log 2>&1` }
    end
    @pids.each { |pid| Process.wait(pid) }
    

    如果这个实现有一些缺点,请补充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2016-08-25
      • 2020-11-17
      • 2016-01-22
      • 2016-10-07
      • 2019-08-21
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多