Webベースの再起動またはトリガー:ロック可能な読み取りによるシンプルで安価なプロセス同期()

多くの場合、管理タスクとWebプログラミングタスクは、システムのさまざまなコンポーネント間の同期を必要とします。たとえば、webmordはアクションを実行するコマンドを受け取ります。このアクションをできるだけ早く実行することが望ましいですが、Webインターフェイス自体はこれを実行できません(ルールを変更できないなど)単にルート権限が必要なため、ファイアウォールまたはルーティングテーブル)。 通常、これはい非効率的な方法で解決しました-Webインターフェイスはコマンドを特別なファイルに書き込み、ループ内の別のシェルスクリプト(ルートから動作)が数秒ごとにこのファイルをチェックし、コマンドがある場合は処理しました。



この投稿では、次の簡単な方法を説明します。







ソリューションはqmailのソースコードでスパイされています。 読み取りデータがない場合、標準のread()操作はブロックされます(ソケットに非ブロックオプションを特に設定しない限り)。 read()+ fifoファイルが問題を解決します。 ハンドラープログラムは、fifoファイルからデータを読み取る必要があります。 空の状態では、単純にスリープ状態になり、負荷は発生しません。 そして、データが表示されるとすぐに-read()が完了し、処理コードを実行できます。



これを行うために、「膝の上」は単純なプログラムトリガーとして記述されました。 起動すると、指定されたファイルをリッスンし、データが表示されると、すぐにパラメーターで指定されたコマンドを呼び出します(トリガーを「プル」したユーザーからではなく、トリガーが起動されたユーザーから)



xenon@dot:~/trigger-1.0$ ./trigger /tmp/myfifo ./prog.sh

fifo: /tmp/myfifo, program: ./prog.sh

file /tmp/myfifo doesn't exists, create it

created fifo /tmp/myfifo

xenon@dot:~/trigger-1.0$ chmod a+w /tmp/myfifo

xenon@dot:~/trigger-1.0$ pidof trigger

8552







プログラムは(デーモンによって)起動され、FIFOファイルmyfifoを作成し、データが表示されると、prog.shプログラムを開始します。 2番目のチームでは、全員がFIFOに書き込むことを許可しましたが、もちろん、より慎重に構成することもできます(たとえば、グループメンバーの記録を許可し、www-dataグループを割り当てる)。



私たちの場合、prog.shスクリプト自体は非常に単純です-起動時間を記録するだけです:

xenon@dot:~/trigger-1.0$ cat prog.sh

#!/bin/sh



echo `date` started, ui: `whoami` >> program.log









当然、あなたの場合、あなたはそれをあなたのスクリプトで置き換える必要があり、それは仕事をするでしょう。



今確認してください:

www-data@dot:/tmp$ id

uid=33(www-data) gid=33(www-data) =33(www-data)

www-data@dot:/tmp$ echo > /tmp/myfifo

www-data@dot:/tmp$ echo > /tmp/myfifo

www-data@dot:/tmp$ echo > /tmp/myfifo

www-data@dot:/tmp$ exit









何が起こったのか見てみましょう:

xenon@dot:~/trigger-1.0$ cat program.log

. . 1 20:47:47 NOVST 2011 started, ui: xenon

. . 1 20:47:48 NOVST 2011 started, ui: xenon

. . 1 20:47:49 NOVST 2011 started, ui: xenon









ご覧のとおり、スクリプトはコマンドが送信されたのと同じ秒で起動されました。 出来上がり!



トリガー自体の重量はわずか12Kbで、ブロックされた読み取り()はシステムに特に負荷をかけず、即座に機能します。



これで、Webインターフェースをシステム操作に簡単に固定できます(マシンの再起動、サービスの再起動、iptablesへのルールの追加など)。 当然、Webサーバーグループからの信頼されていないコードは機能せず、Webインターフェイスへのアクセスはhttps経由でローカルネットワークからのみパスワードで保護されると考えています。 引き金があるので、足を撃つのがさらに便利になりました。 :-)



All Articles