たとえば、私は定期的にcronジョブとして実行したい10個のスクリプトを持っています。しかし、私はそれらのすべてが同時に動くことを望んでいません。私はそれらのうち2つだけを同時に動かしたいと思う。プロセススケジューリング
私が考えている1つの解決策は、2つのスクリプトを作成し、それぞれに5つのステートメントを入れ、それらをcrontabの別々のエントリとして入れます。しかし、その解決策は非常に珍しいようです。
上記のタスクを実行するための既存のUNIXツールはありますか?
たとえば、私は定期的にcronジョブとして実行したい10個のスクリプトを持っています。しかし、私はそれらのすべてが同時に動くことを望んでいません。私はそれらのうち2つだけを同時に動かしたいと思う。プロセススケジューリング
私が考えている1つの解決策は、2つのスクリプトを作成し、それぞれに5つのステートメントを入れ、それらをcrontabの別々のエントリとして入れます。しかし、その解決策は非常に珍しいようです。
上記のタスクを実行するための既存のUNIXツールはありますか?
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
と交換すると、これは面白いようです。私は試してみて、それがどうなるか教えてくれるでしょう。 –
注: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から読み込まれます。
私は、同期メソッドとして名前付きパイプ(シェルが開くとすぐに忘却に送られる)を使用します。単一のバイトしか書かれていないので、状況を複雑にする競合状態の問題はない。
GNUパラレルは、タスクのこの種のために設計されています
sem -j2 do_stuff
sem -j2 do_other_stuff
sem -j2 do_third_stuff
do_third_stuff
do_stuff
かdo_other_stuff
のいずれかが終了したときにのみ実行されます。イントロ動画
ウォッチは、より多くを学ぶために:
あなたには、いくつかの順序に従って、これらのスクリプトを実行する必要がありますか? – ajreal
@ajreal、いいえ特定の注文は必要ありません。お互いに独立しています。 –