次の質問があります。バックグラウンドで実行される機械学習プロセスがあります。より良い点は、私が実行したい項目が多いということです(たとえば5つだとしましょう)。それぞれはCPUとGPUの電力を消費するため、特定の期間(たとえば、1時間、実際にはスクリプト自体は1時間後に終了することがあります)、1つだけ実行してから停止することが望ましいです。それを実行し、別のものを実行します。これにより、機械が数日間同時に動作している間にすべてを訓練できます。
課題は次のとおりです。バランス/回転で実行されることを願っています。スクリプト/ハンドラが最初のスクリプトを実行してコンピュータを再起動した後(または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]}" "$@"
より強力なものが必要な場合は、データベースに状態をロックして保存する必要があります。