一連のプロセスを実行するデーモン サービス (バランス分散)

一連のプロセスを実行するデーモン サービス (バランス分散)

次のような問題があります。バックグラウンドで実行される機械学習プロセスがあります。さらに良いことに、それらを実行したいプロセスが多数あります (たとえば 5 つ)。それぞれが CPU と GPU の電力を消費するため、一度に 1 つだけを特定の期間 (つまり 1 時間、実際にはスクリプト自体は 1 時間後に終了できます) 実行し、その後停止して別のプロセスを実行したいと考えています。この方法により、マシンが数日間同時に実行されている間に、それらすべてをトレーニングできます。

課題は次のとおりです。バランスを取りながら、またはローテーションで実行したいです。最初のもの、2 番目、3 番目などを実行するのではなく、スクリプト/ハンドラーで最初のものが実行され、マシンが再起動された後 (または upstart サービスが再起動されるか、それに似た処理)、2 番目のものが実行されるようにする必要があります。再起動するたびに同じプロセスで開始され、ほとんどの時間が最初のプロセスに費やされ、最後のプロセスには最も時間がかからないという状況を避けたいです。

すぐに使えるソリューションを提案してくれる人はいませんか (もちろん簡単な独自のスクリプト/ハンドラーを作成することは除きますが、自分で管理する必要のあるものではなく、徹底的にテストされたものを希望します)。

答え1

どの程度堅牢にしたいかによって異なります。循環リストで「次の」プログラムを実行する単純なソリューションは次のようになります。

#! /usr/bin/env bash

programs=(program1 program2 program3 program4 program5)
state=$HOME/.${0#*/}_state

if [ -f "$state" ]; then
    read idx <"$state"
    if expr "$idx" : '[0-9][0-9]*$' >/dev/null; then
        let idx=(idx+1)%${#programs[@]}
    else
        let idx=0
    fi
else
    let idx=0
fi
printf '%d\n' "$idx" >"$state" || exit 1

exec "${programs[$idx]}" "$@"

より堅牢なものが必要な場合は、ロックが必要になり、おそらく状態をデータベースに保持する必要があります。

関連情報