1

まず、私はプログラミングなどの初心者なので、質問に専門的に正確な用語が不足していることをお詫びしますが、うまくいけば私の要点を理解することができます!

bashまたはtcshで、それ自体がいくつかのプログラムを起動し、異なるコアで3つの長いプロセスを並行して実行し、3つすべてが完了するのを待ってから続行する必要がある長いバックグラウンドプロセスを実行する方法について何か提案はありますか...?

短いが重いビデオ クリップの各フレームにイメージ フィルタを適用するためのシェル スクリプト (bash 用) を作成しました (これは実際には科学的断層像ですが、これは実際には問題ではありません)。次のようになっています。

  1. em2em ソフトウェアを使用して、ファイル全体を別の形式に変換するスクリプトを含むファイルを作成します。

  2. 変換されたファイルを 3 つの等しい部分に分割し、プログラム スパイダーを使用して、Linux サーバーの個別のコア上の個別のプロセスでフレームの各セットをフィルター処理します (速度を上げるため)。最初に、必要なフィルター パラメーターを含む 3 つのバッチ モード ファイル (filter_1/2/3.spi) が作成され、次に 3 つのサブプロセスが起動されます。

    spider spi/spd @filter_1 &  # The first process to be launched by the main script and run in the background on one core
    spider spi/spd @filter_2 &  # The second background process run on the next core
    spider spi/spd @filter_3    # The third process to be run in parallel with the two above and be finished before proceeding further.
    

    これらのフィルタリングされたフラグメントは、最後にまとめられます。

3 つのフィルタリング ステップを同時に実行したかったので、最初の 2 つを単純な & でバックグラウンドに送信し、最後の 1 つをフォアグラウンドに保持して、メイン スクリプト プロセスが 3 つすべてが終了するまで待機するようにしました (同時に発生する必要があります)。時間) 3 つのチャンクを再構築するためにさらに進む前に。スクリプトをフォアグラウンドで実行すると、これはすべて正常に機能しますが、多くのサブプロセスから多くの出力情報が端末にスローされます。私はそれを減らすことができます:

$ ./My_script 2>&1 > /dev/null

ただし、各スパイダー プロセスは引き続き戻ります

*****Spider normal stop*****

ターミナルへ。メイン プロセスをバックグラウンドに送ろうとすると、常に停止し続けます。

バックグラウンドでメイン スクリプトを実行し、3 つのスパイダー サブプロセスを並行して実行する方法を教えてください。

ありがとう!

4

2 に答える 2

2

waitバックグラウンドで各スパイダーを起動し、後でコマンドで使用できるプロセス ID を保存できます。

spider spi/spd @filter_1 &
sp1=$!
spider spi/spd @filter_2 &
sp2=$!
spider spi/spd @filter_3 &
sp3=$!
wait $sp1 $sp2 $sp3

出力を取り除きたい場合は、各コマンドにリダイレクトを適用してください。

更新: 実際には、PID を保存する必要さえありませんwait。パラメーターなしの a は、生成されたすべての子を自動的に待機します。

于 2013-10-07T13:39:21.083 に答える