プログラムが終了する前にGNUはstdoutを並列に出力できますか?

プログラムが終了する前にGNUはstdoutを並列に出力できますか?
echo 'echo "hello, world!";sleep 3;' | parallel

このコマンドは完了するまで何も出力しません。 Parallelのマニュアルページには次のように記載されています。

GNU並列処理は、コマンドの出力がコマンドを順次実行したときに得られるものと同じであることを保証します。

悪魔が表現にあると思います。正常に実行するのと同じ出力を取得できますが、正常に実行するのと同じ出力を得ることはできません。たとえば、私はこれを行うためのオプションを探していましたが、うまく--results /dev/stdoutいきません。

私のユースケースは、実行中のコマンドのリアルタイムの進行状況出力を確認することです。どのように多くのタスクが完了したのか、どの並列タスクが私に表示できるのかではなく、私が見たい各コマンドの進行状況出力に関するものです。

私はbashループ(for i in $x; do cmd & done;)を使用しますが、Ctrl + C一度ですべての操作を停止できるようにしたいと思います。並列処理でそれを行うことができます。

これを並列に実行できますか?そうでなければ他のツールはありますか?

答え1

私はあなたが探していると思います--ungroup。マニュアルページには次のように記載されています。

--group  Group output. Output from each jobs is grouped 
         together and is only printed when the command is finished. 

         --group is the default. Can be reversed with -u.

-uもちろんの同義語です--ungroup

答え2

一部の並列操作の進行状況を表示するには、以下を試してください--tmuxpane --fg

parallel --tmuxpane --fg seq {} 10000000 ::: {1..100}

-uまたは(可能性が高い)を探している可能性があります--lb。からman parallel

   --line-buffer
   --lb
       Buffer output on line basis. --group will keep the output together
       for a whole job. --ungroup allows output to mixup with half a line
       coming from one job and half a line coming from another job.
       --line-buffer fits between these two: GNU parallel will print a full
       line, but will allow for mixing lines of different jobs.

       --line-buffer takes more CPU power than both --group and --ungroup,
       but can be much faster than --group if the CPU is not the limiting
       factor.

       Normally --line-buffer does not buffer on disk, and can thus process
       an infinite amount of data, but it will buffer on disk when combined
       with: --keep-order, --results, --compress, and --files. This will
       make it as slow as --group and will limit output to the available
       disk space.

       With --keep-order --line-buffer will output lines from the first job
       while it is running, then lines from the second job while that is
       running. It will buffer full lines, but jobs will not mix. Compare:

         parallel -j0 'echo {};sleep {};echo {}' ::: 1 3 2 4
         parallel -j0 --lb 'echo {};sleep {};echo {}' ::: 1 3 2 4
         parallel -j0 -k --lb 'echo {};sleep {};echo {}' ::: 1 3 2 4

       See also: --group --ungroup

[...]

   --ungroup
   -u  Ungroup output.  Output is printed as soon as possible and by passes
       GNU parallel internal processing. This may cause output from
       different commands to be mixed thus should only be used if you do not
       care about the output. Compare these:

         seq 4 | parallel -j0 \
           'sleep {};echo -n start{};sleep {};echo {}end'
         seq 4 | parallel -u -j0 \
           'sleep {};echo -n start{};sleep {};echo {}end'

       It also disables --tag. GNU parallel outputs faster with -u. Compare
       the speeds of these:

         parallel seq ::: 300000000 >/dev/null
         parallel -u seq ::: 300000000 >/dev/null
         parallel --line-buffer seq ::: 300000000 >/dev/null

       Can be reversed with --group.

       See also: --line-buffer --group

輝く例-uは、stdoutとstderrが同じ行に混在していることです。

echo -n 'This is stdout (';echo -n stderr >&2 ; echo ')'

--lb とを使用すると形式が正しくありません--group

-uただし、プロセス間の半分の線の混在によってフォーマットが正しく指定されるという保証もありません。http://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P

次のことを試すこともできます。 --latest-line は、各ジョブに対して画面に1行を保持し、そこに最新の行を印刷します。

--最新ライン

答え3

私の解決策は、出力をファイルに書き込み、コマンドを使用してリアルタイムで変更を確認し、操作が完了したらtail -f <file>自動的に削除することでした。フラグも役に立つと思います--progress

parallel --progress ./program {} '>' {}.log';' rm {}.log ::: A B C

ここのタスクはprogramさまざまな入力で実行しA、プログラムの出力を適切なログファイルに送信Bすることで構成されます。C

関連情報