この投稿では、次の簡単な方法を説明します。
- プログラミングは必要ありません-小さなレンガのシステムを構築するのはUNIXのみです
- 多くのリソースを消費しません(ファイルを無駄に注ぐ必要はありませんが、プログラム自体の重量はシェルよりもはるかに少ないです)
- すぐに動作します
ソリューションは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経由でローカルネットワークからのみパスワードで保護されると考えています。 引き金があるので、足を撃つのがさらに便利になりました。 :-)