web-dev-qa-db-ja.com

関数の並列実行

私は3つの機能を持っています

function WatchDog {
sleep 1

#something
}
function TempControl {
sleep 480

#somthing
}
function GPUcontrol {
sleep 480

#somethimg
}

そして、私はそれを次のように実行しています

WatchDog | TempControl | GPUcontrol

このスクリプトはrc.localファイルにあります。したがって、論理的には自動的に実行されます。事は最初の機能がうまくいっているということです。しかし、2番目と3番目は始まっていません。しかし、私がそれを始めているなら

Sudo bash /etc/rc.local 

それはうまくいきます。何が問題ですか? init.dディレクトリに追加する場合も同じです。

4

パイプは、1つのコマンドの出力を次のコマンドに送信します。 &(アンパサンド)を探しています。これにより、プロセスがforkされ、バックグラウンドで実行されます。したがって、実行した場合:

WatchDog & TempControl & GPUcontrol

3つすべてを同時に実行する必要があります。

また、Sudo bash /etc/rc.localを実行すると、それらは並列ではなく直列に実行されていると思います(各コマンドが完了するのを待ってから、次のコマンドを開始します)。それは次のようなものです:

WatchDog ; TempControl ; GPUcontrol

コマンド区切り文字

;セミコロン-command1 ; command2

これは、成功したかどうかに関係なく、command2の終了後にcommand1を実行します

アンパサンド-command1 & command2

これにより、サブシェルでcommand1が実行され、同時にcommand2が実行されます。

OR論理演算子-command1 || command2

これはcommand1を実行し、次にcommand2を実行します[〜#〜] only [〜#〜]command1が失敗した場合

&& AND論理演算子-command1 && command2

これはcommand1を実行し、次にcommand2[〜#〜] only [〜#〜]command1が成功した場合に実行します。

2
jesse_b

単にGNU parallel

export -f WatchDog && export -f TempControl && export -f GPUcontrol

parallel -j3 ::: WatchDog TempControl GPUcontrol

  • export -f <funcname>-parallelが参照する関数をエクスポートします

  • -j N-[〜#〜] n [〜#〜]ジョブまで並列で実行


デモ用のテストケース:

function a () { seq -s' ' 1 10; sleep 10; }
function b () { echo {a..z}; sleep 5; }
function c () { echo {-100..-80}; sleep 10; }
export -f a && export -f b && export -f c
parallel --no-notice  -j3 ::: c b a

a b c d e f g h i j k l m n o p q r s t u v w x y z
-100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80
1 2 3 4 5 6 7 8 9 10
5
RomanPerekhrest