Last modified: 2006/06/02

[Home]

AWK 100行野郎ワールド (AWK hundreds liners)


私のWebページで使用している、AWKによるCGIスクリプトを公開します。
AWKでもここまで出来るというサンプルとしてご覧ください。

なお、登場するファイル名/ディレクトリ名は架空のものですので、ご了承ください。 (^o^);
また、これらのスクリプトを実際に動作させるためには、Webサーバー上への各種設定が必要となる場合があります。
(2006/06/02 : アクセス解析CGIは、昔使っていたISPでは動作確認済みだったんですが、自宅サーバーの FreeBSD 4.3 では動かないことが判明… (^^;) 修正しました。)


awkscript.txt (10KByte)
▼ getClientInfo.awk : 訪問者統計情報を収集する。 (このページでは使用例として、ここ [ ] ← に 1pixel×1pixel の画像として埋め込んであります。)
▼ dispStatInf.awk : 訪問者統計情報ファイルおよびその分析結果を表示する。 (使用例はこちら)

awkscript.lzh (4KByte , 上記の他、その他いろいろなawkスクリプトが入っています。)
▼ getClientInfo.awk : 訪問者統計情報を収集する。
▼ dispStatInf.awk : 訪問者統計情報ファイルおよびその分析結果を表示する。 (使用例はこちら)
その他いろいろ (DOSプロンプトで使用するスクリプト)
▽ drvbkup.awk : ハードディスクの内容をフォルダ毎に圧縮してまるごとバックアップする。 drvbkup.batから呼び出す。
▽ calfeei.awk : Windows 95のダイアルアップネットワークのログ(C:\windows\ModemLog.txt)から月間使用時間を集計する。
▽ cpy_etc.awk : Netscape Navigatorのキャッシュフォルダーのファイルのうち、HTMLファイル、グラフィックファイル以外をコピーする。 updt_cpy.batから呼び出す。
▽ makehtml.awk : ナンバリングされたリンクを持つHTML文書を自動生成する。
▽ addpath.awk : CICA,SIMTELのCD-ROMの説明ファイルの各行にパス名をつける。
▽ ntiapath.awk : NTIA CD-ROMの説明ファイルをPATH付きで一つにまとめる。
▽ wn95path.awk : win95.com CD-ROMの日本語説明ファイルをPATH付きで一つにまとめる。




Q & A コーナー
Q1.
ところで、質問なんですが、紹介している AWK スクリプトで「プロセスロック関数」というのが出てきますが、これは一体どーゆー作業をしているのでしょうか?

A1.
プロセスロック関数についてご説明します。

WWWサーバーには同時に何人もの人がアクセスします。ということはあるCGIのホームページを同時刻に見る人がいる可能性があるわけです。
マルチタスク(UNIXではマルチプロセス)のオペレーティングシステムでは同時に多数のプログラムを実行する事が出来ます。そして一つのプログラム(CGI)を同時に実行することも可能なわけです。
さてここでそのCGIが同時に呼び出されてファイル書き込みをする場合どんな動きをするのでしょうか。例えば訪問者カウンターCGIを考えてみましょう。
   プロセスA           プロセスB        カウンター値
                               保存ファイルの値

現在のカウンター値を読む。   現在のカウンター値を読む。     5
   「5だ!」           「5だ!」          |
     ↓               ↓            |
カウンター値に1を加える。   カウンター値に1を加える。     |
   「6だ!」           「6だ!」          |
     ↓               ↓            |
計算した値をファイルに書く。  計算した値をファイルに書く。    ↓
 「6を書きこむ!」       「6を書きこむ!」        6
上記のように同時に2回のアクセスがあったにもかかわらずカウンターは1つしか上がりません。しかも同時に同じファイルへの書き込みを行うと最悪の場合ファイルが壊れるかもしれません。

そこでプロセスロック関数が登場します。
プロセスロック関数は「指定したプロセスを同時に1つしか実行させない」という役割をさせたいわけです。 つまり「自分自身が既に他のプロセスで実行中なら、それが終了するまで待つ」という動作をします。 先ほどの例ではプロセスAが実行中の間はプロセスBは実行を停止していれば問題が解決するわけです。
さて我らがawk君はテキスト処理言語ですから、そんな便利な関数は持っていません。そこで外部コマンドに頼ることになります。UNIXのコマンドで「プロセス間をまたがって、“何か”を設定済みかどうかが分かる」ものがあるかと探してみると……
シンボリックリンク作成関数『ln』があります。この関数は作成しようとしたシンボリックリンクが既に作成されているとエラー終了します。この性質を利用して「プロセス間をまたがって、“シンボリックリンク”を設定済みかどうか」を判定します。 (なおこの仕組みは私が考えたわけではなく、昔のえらい人が考え出したものです。)

《さて、やっと本題です。》
私の作成したプロセスロック関数の処理フローを説明すると、

1.リトライカウンターを10に初期化する。
2.シンボリックリンク「lock_image」をサブディレクトリ「data」配下に作成し、
  成功したら7番へ。
3.リトライカウンターを1減らす。
4.もしリトライカウンターがゼロ以下になったら、リザルト値を0にして7番へ。
5.3秒待つ。
6.2番へ戻る。
7.終了。
、となります。つまり「自分自身のCGIが実行中の間は30秒待って、それでも終わらなければエラー終了する」という動作をします。

なおPerlではファイルロック関数『flock』があり、これを利用してプロセスロックを実現しています。PerlのCGI解説本には大抵プロセスロック関数のサンプルが載っています。

それでは、研究してみてください。

[Home]



スポンサーのサイトにも訪れてください!


・ このコンテンツ/awk Scriptの無断転載を禁じます。必要であれば本ページへのリンクを張ってください。
・ このコンテンツ/awk Scriptを改造する場合はオリジナル著作者のCopyrightを残してください。
・ このコンテンツ/awk Scriptを個人のコンピュータへダウンロードして個人的に使用するのはバンバンやっちゃってください。


中司浩史(Nakatsukasa, Hiroshi)