一度に1つのジョブを処理するバッチ処理

一度に1つのジョブを処理するバッチ処理

私は柔軟なキューイング構成可能性を備えた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に設定されています。また、前のコマンドが成功した場合にのみコマンドを実行するなど、いくつかの高度な機能もあります。各ジョブのキューと詳細を表示することもできます。詳細は以下で確認できます。マンページ

関連情報