2010-11-23 6 views
4

たとえば、私は定期的にcronジョブとして実行したい10個のスクリプトを持っています。しかし、私はそれらのすべてが同時に動くことを望んでいません。私はそれらのうち2つだけを同時に動かしたいと思う。プロセススケジューリング

私が考えている1つの解決策は、2つのスクリプトを作成し、それぞれに5つのステートメントを入れ、それらをcrontabの別々のエントリとして入れます。しかし、その解決策は非常に珍しいようです。

上記のタスクを実行するための既存のUNIXツールはありますか?

+0

あなたには、いくつかの順序に従って、これらのスクリプトを実行する必要がありますか? – ajreal

+0

@ajreal、いいえ特定の注文は必要ありません。お互いに独立しています。 –

答えて

1

jobsビルトインは、実行中の子プロセスの数を表示します。いくつかの簡単なシェルスクリプトは、このタスクを実行することができます。

MAX_JOBS=2 

launch_when_not_busy() 
{ 
    while [ $(jobs | wc -l) -ge $MAX_JOBS ] 
    do 
     # at least $MAX_JOBS are still running. 
     sleep 1 
    done 
    "[email protected]" & 
} 

launch_when_not_busy bash job1.sh --args 
launch_when_not_busy bash jobTwo.sh 
launch_when_not_busy bash job_three.sh 
... 
wait 
+0

と交換すると、これは面白いようです。私は試してみて、それがどうなるか教えてくれるでしょう。 –

1

注:mobruleによって指摘されているように、引数なしで組み込みのwaitがすべての子プロセスを終了するのを待つため、私の元の応答は機能しません。したがって、より多くの子プロセスのコストでポーリングを回避し、次の「parallelexec」スクリプト、:

#!/bin/bash 

N="$1" 

I=0 

{ 
     if [[ "$#" -le 1 ]]; then 
       cat 
     else 
       while [[ "$#" -gt 1 ]]; do 
         echo "$2" 

         set -- "$1" "${@:3}" 
       done 
     fi 
} | { 
     d=$(mktemp -d /tmp/fifo.XXXXXXXX) 

     mkfifo "$d"/fifo 

     exec 3<>"$d"/fifo 

     rm -rf "$d" 

     while [[ "$I" -lt "$N" ]] && read C; do 
       ($C; echo >&3) & 

       let I++ 
     done 

     while read C; do 
       read -u 3 

       ($C; echo >&3) & 
     done 
} 

最初の引数は、並列ジョブの数です。それ以上の場合は、それぞれがジョブとして実行されます。そうでない場合は、実行するすべてのコマンドが1行ずつstdinから読み込まれます。

私は、同期メソッドとして名前付きパイプ(シェルが開くとすぐに忘却に送られる)を使用します。単一のバイトしか書かれていないので、状況を複雑にする競合状態の問題はない。

+0

builtin 'wait'は子プロセスの* all *が完了するのを待つ – mob

+0

true、その特定のbashの脳死を忘れました。 fds/read ... – thkala

1

GNUパラレルは、タスクのこの種のために設計されています

sem -j2 do_stuff 
sem -j2 do_other_stuff 
sem -j2 do_third_stuff 

do_third_stuffdo_stuffdo_other_stuffのいずれかが終了したときにのみ実行されます。イントロ動画

ウォッチは、より多くを学ぶために:

http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1