1

私のrubyスクリプトは複数の外部プロセスを処理する必要があるため、出力を別のプロセスから別のログファイルにリダイレクトする方法を考えていました。また、外部プロセスの完了にはかなりの時間がかかるため、それらを並行して処理するための最良の方法は何ですか?

私はrubyを初めて使用するので、シェルに相当するコードを表示できます。

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

私が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 に答える
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 に答える