1

xargs は、実行可能な最大数のプロセスをすでに実行している場合でも、stdin から入力行を読み取るように見えます。

次に例を示します。

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do echo $ii; sleep 2; done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"

上記のプロセスを開始してから 20 秒後、Ikillall xTriggerですが、xargs は xTrigger が出力したすべてをバッファリングしたため、xRunner は 1..10 を出力し続けました。私が欲しいのは、1,2だけを印刷することです

この動作を変更して、新しいコマンドを開始する場合にのみ xargs を stdin から読み取るようにして、xargs が読み取るまで xTrigger が echo ステートメントで待機するようにする方法はありますか? 私の標準入力には非常に動的なコンテンツがあるため、これは非常に便利です。

安定していてエレガントだからという理由だけで xargs に固執しようとしています。xargs で簡単な方法がない場合にのみ、余分なコードを書きたい。

ご助力いただきありがとうございます!

4

3 に答える 3

0

xTrigger() の Bash PID を強制終了する必要はありませんか?

bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>
于 2011-02-22T09:25:31.717 に答える
0

私のシステムでは、実行中のジョブの 1 つがゼロ以外のリターン コードで終了すると、xargs はデフォルトで停止します。したがって、XRunner を実行している bash pid にシグナルを送信する必要があります。

于 2011-02-22T16:25:53.693 に答える
0

「bash -c xRunner」ジョブが実行されていない場合にのみ、xTrigger が次のトリガーを生成するようになりました。今すぐうまくいきます:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do 
      echo $ii; 
      while [[ $(psgrep xRunner|grep -v xargs|wc -l) -ge 1 ]]; do
         sleep 2; 
      done
   done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"
于 2011-02-22T23:02:06.437 に答える