1

我的 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
4

2 回答 2

0

可以使用非常相似的方法将输出重定向到日志文件,使用反引号或%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

于 2012-12-29T04:36:05.370 回答
0

我在 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) }

如果此实现有一些缺点,请添加。

于 2012-12-29T07:06:46.610 回答