2017-05-15 3 views
2

2つのLinuxコマンドを実行して、それぞれが終了せずにstdoutに出力し続けます(I Ctrl-Cまで)。フォアグラウンドで2つのLinuxコマンドを実行し、標準出力をマージすることは可能ですか

2つのコマンドを2つの別々の端末で問題なく実行できます。

しかし、1つの端末で1つのコマンドを実行して、上記の両方のコマンドをフォアグラウンドで実行し、それらをstdoutで共有することはできますか?

答えて

4

これは非常に簡単にGNUパラレルで制御できます。ダミーの2つのプロセスf1f2を繰り返し出力して止めることはないとしましょう。彼らは、次のようになります。

F1

#!/bin/bash 
while :; do 
    echo 1,$RANDOM 
    sleep 2 
done 

F2今

#!/bin/bash 
while :; do 
    echo 2,$RANDOM 
    sleep 2 
done 

一度に両方を開始することができます(明らかに - それはGNUと呼ばれる理由もなくを平行ではないです)このように:

parallel --line-buffer ::: ./f1 ./f2 
1,17387 
2,1457 
2,32743 
1,15684 
... 
... 

それとも、あなたはプロセス名でタグ付けされた出力の行をしたい場合、あなたはこれを行うことができます。

parallel --line-buffer --tag ::: ./f[12] 
./f1 1,11877 
./f2 2,28716 
./f2 2,7683 
./f1 1,23392 
... 
... 

あなたはControl-Cプロセス場合は、彼らは両方とも停止します - あなたはどうかということを変更することができますが、希望 - --haltをマンページで検索します。

+0

これについて知りませんでした。大好きです!私はこれがビルトインのものだったと思う。ありがとう! –

+1

** GNU Parallel **は悲しいほど広告が下りすぎて使用されていません。前年同期のCPU周波数の増加とマルチコア時代の始まりに伴い、IMHOが前進しています。あなたのプロジェクトに幸運を祈る! –

0

使用中括弧:

{ command1; command2; } > output 

あなたがstdoutとstderrの両方リダイレクトしたい場合:

{ command1; command2; } &> output 
+1

これは、command1が終了するまでcommand2を実行しません。しかし、OPは、どちらのコマンドも終了するまで終了しないことを明確にしており、意図は両方とも並行して実行されているということです。 – rici

2

をあなたは最前面に背景に最初の2つ目を実行することができます彼らが共有することになりますstdout。 Ctrl-Cで2番目のものを止めることができますし、1番目を止めたい場合は仕事を殺す必要があります。プレスfgその後、Ctrl-C

cmd1 & cmd2 

あなたがミックス出力ファイルを持つようにしたい場合は、

cmd1>file & cmd2>file 

あなたが;代わりの&を使用する場合は、2番目のコマンドがします開始第一終了あなたがもっと欲しい場合は読み取り可能な出力。

両方の端末を同じ端末で実行し、それらを一緒に停止できるかどうかは不明です。スクリプトなどを使用している可能性があります。

+0

'stdbuf'でコマンドを実行して、出力行をマージすることができます。 – hek2mgl

+0

ありがとう、ニコラス。これは実際には、ユーザーがバックグラウンドプロセスに対処しなければならないという点を除いて、悪い選択肢ではありません。 –

関連する問題