我的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
答案 0 :(得分: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来解决这种情况。
要同时处理它们,我建议您查看EventMachine和EM-SSH。
答案 1 :(得分: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) }
如果此实现有一些缺点,请添加。