1

Linuxシェルコマンドを順番にキューに入れ、一度に1つずつ実行できる簡単なソリューションを見つけたり実装したりしようとしています。基準は次のとおりです。

  1. キューはコマンドを 1 つずつ実行する必要があります。つまり、2 つのコマンドを同時に実行することはできません。
  2. 事前にコマンドのリストを持っていません。それらは、私の Web サーバーが受信する Web リクエストから送信されます。つまり、キューが長時間空になる可能性があり、同時に 10 件のリクエストが着信する可能性があります。
  3. 私の Web サーバーはシェルへのシステム コールしか実行できないため、このプログラム/ソリューションはコマンド ラインから呼び出すことができる必要があります。
  4. 私は 1 台のマシンしか持っていないので、複数のマシンに作業を任せることはできませんし、その必要もありません。

もともと、atコマンドは自分のやりたいことができると思っていましたが、唯一のことは、コマンドを順番に実行しないことです。

これらの部分を使用して、Pythonで独自のソリューションを実装することを考えています:

  1. ロックファイルを含む専用ディレクトリを用意する
  2. キューに入れられたコマンドは、インクリメント シーケンス ID またはタイムスタンプなどを含むファイル名を持つ個別のファイルとして保存されます。これを「コマンド ファイル」と呼びます。
  3. fcntlモジュールを使用してロック ファイルにPython スクリプトを記述し、スクリプトのインスタンスが 1 つだけ実行されるようにします。
  4. スクリプトはディレクトリでファイルを監視し、ファイル内のシェル コマンドをファイル名の順に実行します。
  5. ディレクトリに「コマンド ファイル」がなくなると、スクリプトはロック ファイルのロックを解除して終了します。
  6. Web サーバーがジョブをキューに入れたい場合、新しい「コマンド ファイル」が追加され、Python スクリプトが呼び出されます。
  7. Python スクリプトは、それ自体の別のインスタンスが実行されているかどうかを確認します。はいの場合は、終了します。これにより、他のインスタンスが新しくキューに入れられた「コマンド ファイル」を処理できるようになります。そうでない場合は、ロックファイルをロックし、「コマンドファイル」の実行を順番に開始します

これはうまくいくように聞こえますか?処理方法がわからない唯一の競合状態は、スクリプトの最初のインスタンスがディレクトリをチェックして空であることを確認し、ロック ファイルのロックを解除する前に、新しいコマンドがキューに入れられ、スクリプトの新しいインスタンスが呼び出されたときです。 . ファイルがロックされていることがわかると、その新しいスクリプトは終了します。次に、元のスクリプトがファイルのロックを解除して終了します。

すでにこれを行っているものがあるので、自分で実装する必要はありませんか?

4

2 に答える 2

8

FIFO とも呼ばれる名前付きパイプを使用します。

mkfifo /tmp/shellpipe

入力がパイプから来るシェル プロセスを開始します。

/bin/sh < /tmp/shellpipe

Web サーバーがコマンドを実行する場合、コマンドをパイプに書き込みます。

sprintf(cmdbuf, "echo '%s' > /tmp/shellpipe", command);
system(cmdbuf);
于 2012-10-22T04:28:23.007 に答える
2

posixメッセージキューは、これに合わせて調整されているようで、タイムスタンプ付きのファイルなどをいじるよりもはるかに簡単(かつ高速)です。スクリプトは、リクエストが着信したときにリクエストをキューに入れることができます。別のスクリプトがリクエストをデキューして実行します。キューに適用されるいくつかのサイズ制限がありますが、それらをヒットすることに近づくとは思えません。

于 2012-10-22T05:14:43.280 に答える