序論
スタンリー・ホップクロフトは、組込Perlインタプリタで多くの仕事をし、それを使う利点/欠点を批評しました。 また、彼は組込インタプリタで正しく動作するPerlプラグインを作成するとき役立つ幾つかのヒントを与えました。 このドキュメンテーションの大部分が彼のコメントによっています。
このドキュメンテーションで使用される"ePN"が組込みPerl Nagiosを示すことに注意してください、それは組込みPerlインタプリタと共にコンパイルされたNagiosです。
対象者
- 普通のPerl開発者。 これらの方は内部の知識や特色の深い理解なしに言語の強力な特徴のあるアプリケーション使います。
- かなり深い理解と言うよりむしろ実用性なアプリケーションです。
- あなたがPerlオブジェクト、名前管理、データ構造、およびデバッガに満足なら、それはたぶん十分です。
Perl プラグインを開発する時するべきでこと (ePNであるか否かに関係なく)
- 何らかの出力をいつもいつも出します。
- 'use utils'や import を使い、結果を出します。 ($TIMEOUT %ERRORS &print_revision &support)
- 標準のPerlプラグインがどう自分の仕事するか見てください。例えば。
- 何時でも$ERRORS{CRITICAL}、$ERROR{OK}、などで終わります。
- コマンドライン引数を読むのにgetoptを使用します。
- タイムアウトを管理
- コマンドライン引数が全くないとき、使い方を(あなたによって与えられる)印刷します。
- 標準のスイッチ名を使用します。 ('すなわち Hホスト、 V 'バージョン')
ePNのPerlプラグインを開発するためにしなければならないこと
- <DATA>は使用できません。 代わりにここでドキュメントを使用します、例えば。
my $data = <<DATA;portmapper 100000 portmap 100000 sunrpc 100000 rpcbind 100000 rstatd 100001 rstat 100001 rup 100001 .. DATA %prognum = map { my($a, $b) = split; ($a, $b) } split(/\n/, $data) ;
- 予想するように、BEGINブロックは働きません。 避けるのが最も良いかもしれません。
- 確実にコンパイル時に清廉潔白か確認します。
- (他のスイッチ、[特に T] は役に立たないでしょう)
- use perl -c 。
- 変数データをサブルーチンに渡す意味でグローバル・スコープ中に(my)を使った構文スコープを使わない様にします。
事実、実行チェックでサブルーチンが1度以上呼ばれるならそれは致命的です。
サブルーチンは'閉じられた'として扱われます。グローバル・レキシカルな最初の値をそれから呼ばれるサブルーチンで制限します。
しかしながら、あなたグローバルが 読み込みのみ(例えば、複雑な構造)では問題とはなりません。
Bekmanが、代わりに勧めることは以下のどれかです:
- サブルーチンをanonymousにし、コード参照で呼び出します、例えば。
- グローバルは構文にいれ、そして、自身のパッケージでサブルーチンを使用します。 (オブジェクトかモジュールとしての)
- 参照か別名の情報をサブルーチンに渡す (\$lex_var or $_[n])
- レキシカルをパッケージ・グローバルと取り替えてます。'use strict'を 'use vars qw(glocal1 global2 ...)'と代えます。
turn this into my $x = 1 ; my $x = 1 ; sub a { .. Process $x ... } $a_cr = sub { ... Process $x ... } ; . . . . a ; &$a_cr ; $x = 2 $x = 2 ; a ; &$a_cr ; # anon closures __always__ rebind the current lexical value
- 詳しい情報をどこで得られるかを知ってください。
役に立つ情報は普通の疑問から持つことができます。(オライリーの本、そしてダミアンコンウエイ「オブジェクト指向Perl」)しか し本当に有用な内容は Stas Bekman の mod_perl ガイドが有ります。 http://perl.apache.org/guide/
Nagiosについては何も書いていませんが、この良くまとめられたドキュメントの本は、アパッチの(すなわち mod_perl)組込PerlインタプリタのPerlプログラムの書き方が書いてあります。
perlembed マニュアルページは、内容は基本的で力づけてくれます。
基礎は、リンカーン・ステインとダグ・マッキーカーンはPerlと組込Perlについて多くの事を知っています。彼らの本'PerlとCを使ってアパッチ Modulesを書く'は確かに見る価値があります。
- あなたのプラグインがePNで奇妙な値を返すかもしれません、これは項目#4の問題によって引き起こされるらしい事を考えていてください。
- 以下でデバッグの準備をします。
- テストePNを使い、そして
- プリント文をプラグインに追加し、変数を値をSTDERRに表示します。(STDOUTを使用できません)
- プリント文をp1.plに追加し、プラグインを実行する前に、ePNが行っている事を表示してください。(vi)
- フォアグランド・モードでePNを実行します。(たぶん前の推奨と関連しています)
- あなたのプラグインで 'Deparse' モジュールを使い、パーサがどのように最適化し、インタプリタが実際なにを得るかを見ます。 (Seam M. Burke, によって書かれた2001年秋号の'Perlの定数'を参照。)
perl -MO::Deparse <your_program>
- ePNはあなたのプラグインをどう変えるかを意識し、全てが失敗したなら変換バージョンのデバッグを試してください。
下の p1.plプラグインを書き直し パッケージ名’Embed::'の中で'hndlr'サブルーチンを呼ぶ様にします。 <something_related_to_your_plugin_file_name>'.
あなたのプラグインで@ARGVでコマンドライン引数を受取りたいなら、pl.plは@_を@ARGVに渡します。
これは順番に'eval'をします、そして、evalが誤りを出すなら(文法と実行エラー)、プラグインをチェックをします。
以下の出力はテストePNがそれを実行する前にどうcheck_rpプラグインを変えたかを示しています。 実際のプラグインの多くのコードは示されていません。それは、ePNがプラグインを変換する事にだけ興味を持っているからです。 はっきりさせるため、変換は赤で示されています:
package main; use subs 'CORE::GLOBAL::exit'; sub CORE::GLOBAL::exit { die "ExitTrap: $_[0] (Embed::check_5frpc)"; } package Embed::check_5frpc; sub hndlr { shift(@_); @ARGV=@_; #! /usr/bin/perl -w # # check_rpc plugin for Nagios # # usage: # check_rpc host service # # Check if an rpc serice is registered and running # using rpcinfo - $proto $host $prognum 2>&1 |"; # # Use these hosts.cfg entries as examples # # command[check_nfs]=/some/path/libexec/check_rpc $HOSTADDRESS$ nfs # service[check_nfs]=NFS;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_rpc # # initial version: 3 May 2000 by Truongchinh Nguyen and Karl DeBisschop # current status: $Revision: 1.20 $ # # Copyright Notice: GPL # ... rest of plugin code goes here (it was removed for brevity) ... }
- あなたの製品ePNで実行されるプラグインに'use diagnostics'を使わないでください。 私は、すべてのPerlプラグインがそれによってCRITICALを返すと思います。
- あなたのプラグインをチェックするのに小さな組込Perl Cプログラムを使う事を考えてます。 これは、プラグインが ePNでOKを出すのを保証するには十分ではありません。しかしプラグインがこのテストに失敗すると、ePNで確実に失敗します。 [サンプル・ミニePNはテストPerlプラグインを使うための配布されているNagiosの contrib/ ディレクトリに含まれています。contrib/ディレクトリに移り、'make mini_epn' をタイプしコンパイルします。p1.plファイルがあるのと同じディレクトリでそれを実行しなければなりません(このファイルはNagiosと共に配布されています)。]
参照: 組込Perlインタプリタ概観, プラグインAPI