IBM i(AS/400)バッチ処理に慣れており、柔軟なキュー構成が可能です。 Linuxバッチ処理のために同様の機能を探しています。
最も重要なことは、一度に1つのジョブがキューから取得されて実行されることです。その後、キューはさらにエントリがスキャンされます。もしあれば、次のタスクがフェッチされて実行されます。
at -b
は比較的近くなりますが、ジョブが取るリソースが少ないために負荷が下がらない場合は、より多くのタスクが並列に実行されるため、望ましくありません。
Run-partsは別のオプションですが、動作が静的すぎるため、デーモンとして実行されず、指定されたキューで新しいエントリを検索しません。通常のcronジョブとして実行することもできますが、自分でキューから削除するジョブを処理する必要があります。
必要な機能を実現するために独自にコードを拡張する必要がありますか、それとも代替のバッチキューイングメカニズムを使用できますか?
ts - task spooler. A simple unix batch system
はタスクに対応している必要があります。タスクスプーラー/キューサーバーを実行し、次のような簡単なコマンドで新しいタスクを追加できます。
tsp yourcommand
スロットの数、つまり一度に実行するジョブの数を指定できます。デフォルトでは、これはAFAIKに設定されています。また、前の特定のコマンドが成功した場合にのみコマンドを実行するなど、いくつかの高度な機能も備えています。各ジョブのキューと詳細も表示できます。詳細は manpage を参照してください。
これは、bashを使用するだけで実行できます。
1- mkfifoを使用してfifoを作成します(ファイルも作成できます)
mkfifo mybuff
2- fifoを末尾に追加し、各行をエグゼキュータに渡します(これは一種のタスクサーバーになります)
while IFS= read -r line
do
echo "Running: '$line' with bash"
bash -c "$line"
echo "Finished '$line' with exit code: $?"
done < <(tail -f mybuff)
3-たとえば、コマンドをキューに送信します(これによりクライアントがタスクを要求します)
echo 'sleep 10' >> mybuff
echo 'echo "hello world"' >> mybuff
echo 'my fancy command to be executed' >> mybuff
...
PS:以下の例のようにステップ2を簡略化できますが、コマンドバッファーに「exit」を送信すると、タスクリスナーが終了します
tail -f mybuff | bash -x