Linuxシェルコマンドを順番にキューに入れ、一度に1つずつ実行できる簡単なソリューションを見つけたり実装したりしようとしています。基準は次のとおりです。
- キューはコマンドを 1 つずつ実行する必要があります。つまり、2 つのコマンドを同時に実行することはできません。
- 事前にコマンドのリストを持っていません。それらは、私の Web サーバーが受信する Web リクエストから送信されます。つまり、キューが長時間空になる可能性があり、同時に 10 件のリクエストが着信する可能性があります。
- 私の Web サーバーはシェルへのシステム コールしか実行できないため、このプログラム/ソリューションはコマンド ラインから呼び出すことができる必要があります。
- 私は 1 台のマシンしか持っていないので、複数のマシンに作業を任せることはできませんし、その必要もありません。
もともと、at
コマンドは自分のやりたいことができると思っていましたが、唯一のことは、コマンドを順番に実行しないことです。
これらの部分を使用して、Pythonで独自のソリューションを実装することを考えています:
- ロックファイルを含む専用ディレクトリを用意する
- キューに入れられたコマンドは、インクリメント シーケンス ID またはタイムスタンプなどを含むファイル名を持つ個別のファイルとして保存されます。これを「コマンド ファイル」と呼びます。
fcntl
モジュールを使用してロック ファイルにPython スクリプトを記述し、スクリプトのインスタンスが 1 つだけ実行されるようにします。- スクリプトはディレクトリでファイルを監視し、ファイル内のシェル コマンドをファイル名の順に実行します。
- ディレクトリに「コマンド ファイル」がなくなると、スクリプトはロック ファイルのロックを解除して終了します。
- Web サーバーがジョブをキューに入れたい場合、新しい「コマンド ファイル」が追加され、Python スクリプトが呼び出されます。
- Python スクリプトは、それ自体の別のインスタンスが実行されているかどうかを確認します。はいの場合は、終了します。これにより、他のインスタンスが新しくキューに入れられた「コマンド ファイル」を処理できるようになります。そうでない場合は、ロックファイルをロックし、「コマンドファイル」の実行を順番に開始します
これはうまくいくように聞こえますか?処理方法がわからない唯一の競合状態は、スクリプトの最初のインスタンスがディレクトリをチェックして空であることを確認し、ロック ファイルのロックを解除する前に、新しいコマンドがキューに入れられ、スクリプトの新しいインスタンスが呼び出されたときです。 . ファイルがロックされていることがわかると、その新しいスクリプトは終了します。次に、元のスクリプトがファイルのロックを解除して終了します。
すでにこれを行っているものがあるので、自分で実装する必要はありませんか?