私は柔軟なキューイング構成可能性を備えたIBM i(AS / 400)バッチに精通しています。同様のLinux用のバッチツールを探しています。
最も重要なのは、キューから一度に1つのジョブを取得して実行することです。その後、より多くの項目を見つけるためにキューを検索します。その場合は、次のタスクを実行してください。
at -b
比較的近いですが、ジョブが少なすぎるリソースを占めて負荷が低くなると、より多くのジョブが並列に実行されるため、望ましくありません。
ウィジェットを実行することも別のオプションですが、ウィジェットの動作は静的すぎて、特定のキューで新しいエントリを見つけるためにデーモンとして実行されません。通常のクローンジョブとして実行できますが、キューからジョブの削除を直接処理する必要があります。
必要なものを達成するには、コードを直接書くか拡張する必要がありますか?それとも、代替バッチキュー処理メカニズムを使用できますか?
答え1
bashを使用すると、簡単にこれを行うことができます。
1-mkfifoを使用してfifoを作成する(ファイルを作成することもできます)
mkfifo mybuff
2-tail 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
答え2
ts - task spooler. A simple unix batch system
作業に依存する必要があります。ジョブスプーラ/キューサーバーを実行し、次の簡単なコマンドを使用して新しいジョブを追加できます。
tsp yourcommand
スロット数、つまり一度に実行する必要があるジョブの数を指定できます。私が知る限り、デフォルトでは値は1に設定されています。また、前のコマンドが成功した場合にのみコマンドを実行するなど、いくつかの高度な機能もあります。各ジョブのキューと詳細を表示することもできます。詳細は以下で確認できます。マンページ。