dbx - みる会図書館


検索対象: UNIX MAGAZINE 1992年10月号
13件見つかりました。

1. UNIX MAGAZINE 1992年10月号

これで、コアファイルの大きさに制限はなくなりま こまで、プログラムが異常終了したときにコアファ イルを作成する方法についてお話ししてきましたが、コ アファイルは積極的に作ることもできます。その場合、 コントロールキーと同時に \ ( バックスラッシュ ) キー を押すか、 gcore というプログラムを使います。 コントロールキーを押しながら \ キーを押すと、プロ グラムは強制的に停止され、その段階のコアファイルが 得られます。一方、 gcore では、コアファイルを作成し たいプロセスのプロセス ID を引数として指定し、実行 中のプログラムに対して強制的にコアファイルを作成 します。このプログラムを実行すると、コアファイル を作成したあとも実行を続けることができます。 gcore は、とく ( ンヾックグラウンドで動作しているプログラム に対して有効でしよう。このはかにも、 ki Ⅱコマンドを 使って適当なシグナルを送り、プロセスにコアファイル を作成させることもできます。 dbx を使う場合は無理にコアファイルを作成する必 要はありませんが、無限ループに入ってしまったとき などは、どこで入ったのかが分かりづらいものです。そ こで、無限ループに入った状態のコアファイルを作成し ておき、どこを実行しているかを検査すれば簡単に検出 できることもあります。 コアファイルは、有効に使えば dbx の強力な味方に なります。必要に応して、上手に使ってください。 dbx の起動と終了 dbx か誕生してから、すでに長い時間か経っていま す。そのあいだに、 UNIX ワークステーションを開発 した各社ではさまざまなかたちで dbx の改良が進めら れてきました。その結果、現在では本来の機能はよく似 ているものの、操作性が異なる多数の dbx コマンドが 存在しています。 なかでも、 SunOS に付属の dbx は機能がかなり拡 張されており、もっとも使いやすいテンヾッガの 1 つだと 思います。私自身、各種の OS の dbx を利用した経験 がありますが、一番よく使うのがこの dbx なので、 こではこれをもとに解説することにします。できるかぎ り、ほかの OS の dbx でも対応できるように説明する 128 つもりですが、 SunOS の dbx でなければ実行できな い場合は、その旨を記すことにします。また、すべての OS の dbx を知っているわけではないので、見落しが あるかもしれません。以降で説明する機能が自分の使っ ているマシンの dbx で利用できるかどうかは、マニュ アルなどで調べてみてください。 前置きがすこし長くなってしまいましたが、さっそ く dbx の使い方をみてみましよう。次のように起動し ます 3 。 dbx [ プログラム [ コアファイルまたはプロセス ID ] ] プログラムにはデバッグしたいプログラム名を、コ アファイルには作成したコアファイル名を指定します。 プログラム名もコアファイル名も省略すると、プログラ ムか指定されない状態で dbx が起動されます。その場 合は、 dbx の debug サプコマンド 4 でプログラムを指 定してください。引数を指定せずに dbx を起動すると、 ファイル名の入力を求めたり、デフォルトのファイル として a. 。 ut のデバッグを開始する dbx もあります。 そのため、通常は dbx の起重加にデバッグしたいプロ グラムを指定します。 プログラム名と同時にコアファイル名を指定すると、 コアファイルがそのプログラムから生成されたとみな し、コアファイルに保存された状態のデバッグを開始 します。指定しなかった場合も、 dbx コマンドを起動 したディレクトリに core という名前のファイルがあ れば、それをコアファイルとして処理します。 プロセス ID を指定すると、すでに動作しているプ ログラムをデバッグすることができます。この場合も プログラム名の指定が必要で、プロセス ID で指定され たプロセスは、 dbx の引数に指定されたプログラムの ものでなければなりません。このようなデバッグ方法 は、ライププロセス・デパッグと呼はれます。 この機能を使うと、無限ループに入ったプロセスの プロセス ID を調べ、デバッガで無限ループとなってい る箇所を調べることもできます。また、ある端末から 起動したプログラムを別の端末で動くデバッガを使っ てデバッグできるので、画面出力を用いてインタラク テイプに動作するプログラムでも画面カ話 L れません。プ 3 プロセス ID カ甘旨定できるのは、 SunOS のものだけだと思います。 4 サプコマンドについては彳あします。 UNIX MAGAZINE 1992.10

2. UNIX MAGAZINE 1992年10月号

ミング 24 リスト 3 ru Ⅱサプコマンドの実行 % rm —f core % dbx a. out Reading symbolic information. Read 40 symbols (dbx) run 1 10 Running: a ・ out 1 10 signal SEGV ()o mapping at the fault address) atoi + Oxc : ldsb C%i0] , %i5 LJN Ⅸ流プロクラ in atoi at 0Xf7742794 (dbx) where atoi ( ) at 0Xf7742794 main (argc 3 , argv (dbx) quit 0xf7fffa50) , line 8 in のは難しいのですが、このワーニングを消すことはでき ます。プログラムをコンパイルするとき、静的にリンク をおこなう、つまり -Bstat ic オフションを付けるので す ( リスト 2 ) 。 今度は、ワーニングは表示されていません。コアファ イルに対するワーニングのために正しくデバッグでき ないのであれば、このように静的にリンクしてプログ ラムを作成してください。この例の場合は、ライプラ リのなかのデバッグはできなかったのでワーニングを 消す以外にあまり意味はありませんが、自分で作成した ライプラリがあるときはこの方法力、有です。プログラ ムのデバッグ中はライプラリを共有ライプラリにせす、 普通のライプラリとして静的にリンクすれば、ちゃんと プログラムをデバッグすることができます。 デバッカから実行する さきほどは、コアファイルを作成し、その内容を利用 してプログラムが停止した箇所を調べました。しかし、 dbx ではわざわざコアファイルを作成しなくても、そ の場で実行してみてどこがおかしいのか調べることも できます。リスト 3 を見てください。 この例では、いったんコアファイルを削除し、コア ファイルがない状態で dbx を起動しています。デバッ グ対象のプログラムを実行するには、 dbx のサプコマン ド run を指定します。 run では、コマンド行からプロ UNIX MAGAZINE 1992 ユ 0 グラムを実行するときと同様に引数の指定が可能です。 また、引数としてファイルのリダイレクトも指定できま す。この例では、引数として 1 と 10 を指定してプログ ラムを実行してみました。 dbx からの出力は、セグメ ント違反のシグナルによって、ファイル a. c の 8 行目 で関数 main から呼ばれた関数 atoi のなかでプログラ ムがエラーとなったことが分かります。 今回は、 UNIX て利用できるデバッガ dbx を紹介し ました。また、デバッガを使う場合に有効なコアファイ ルの作成方法についてもお話ししました。さらに、、工 ラーの発生箇所をみつける " ために利用する dbx の 3 つのサプコマンド、 dbx の終了 quit where スタックの内容の出力 run プログラムの実行 も紹介しました。これで、エラーの発生箇所をみつける ことはできるようになりましたが、原因についてはまだ 分かりません。 次回は、これらのエラーの原因を調べるために、変数 の値を検査する方法についてお話しする予定です。 ( いまいすみ・たかし東京工業大学 ) 131

3. UNIX MAGAZINE 1992年10月号

リスト 1 where サプコマンドの実行 % dbx a. out Reading symbolic information. Read 40 symbols core file read error : address not in program terminated by signal SEGV ( Ⅱ 0 mapping at the fault address) (dbx) where core file read error : address not in atOi ( ) at 0Xf7742794 main (argc 3 , argv = Oxf7fff7c8) , line 8 in (dbx) quit リスト 2 -Bstatic オプションを付けて実行 % cc —g —Bstatic ー 0 b. out a. c % b . out 1 10 Segmentation fault ( core dumped) % dbx b . out Reading symbolic information. Read 319 symbols program terminated by signal SEGV ( Ⅱ 0 mapping at the fault address) (dbx) where atoi ( ) at Ox23ac main (argc 3 , argv (dbx) quit Oxf7fffa50) , line 8 in data space data space a. C ー 力するためのコマンドです。このとき、引数として渡 された値も表示されます。リスト 1 の出力の関数 ma ⅲ に関する行では、最初の引数 argc には 3 が、 2 つ目 の引数 argv には Oxf7fff7c8 という値か格納されて いることが分かります ( いきなり Oxf7fff7c8 などと いわれても、なんのことか分からないかもしれません つねにインクリメントしてしまうため、正しく動作しま せん。 さて、プログラムがエラーで止まってしまった場合 は、コアファイルも指定して dbx を起動します。 dbx を起動した段階で where サプコマンドを実行すると、 プログラム中のどこでエラーとなって終了したのかが 分かります ( リスト 1 ) 。 dbx の出力を見ると、ファイル a. c の 8 行目、関数 main のなかから関数 atoi が呼び出されたところでプ ログラムが停止しているようです。これは、 f 。 r 文の条 件判断とインクリメントを処理している部分ですから、 dbx はエラーが起こった部分を適切に指していること になります。 where サプコマンドは、関数呼出しのトレースを出 130 これについては、いすれ詳しく説明する予定 です ) 。 UNIX MAGAZINE 1992.10 が困難なので、ライプラリ中て起こったエラーを調べる く検査できないのです。もともとソースファイルの入手 プラリのなかで起こったことについては、 dbx ではうま ク・リンクを採用しているために起きたものです。ライ グが表示されている点です。これは、 OS がダイナミッ すこし気になるのは、コアファイルに関するワーニン

4. UNIX MAGAZINE 1992年10月号

ロセス ID を指定した場合も通常のデバックイ乍業と同様 なデバッグが可能ですが、プログラムを終了する前に detach サプコマンドを実行する必要があります。ラ イププロセス・デバッグについては、これ以上説明する 予定はありませんが、この点だけは注意しておいてくだ さい。 さて、 dbx を起動すると、 (dbx) というプロンプトが表示されます。このプロンプトに 対して入力するコマンドのことを、 dbx のサプコマン ド ( あるいはたんにサプコマンド ) と呼ぶことにしま しよう。以降では、このサプコマンドについてお話し します。 起動方法について説明したところで、今度は終了方 法を紹介しておきましよう。 dbx を終了するには、 quit サプコマンドを使用します。 quit を実行すると即座に コマンドレベルに戻りますが、 dbx のなかには、再度 確認を求めるものもあります。その場合には y と入力 すれば、 dbx を終了することができます。 なぜ止まったか デバッグの実行例として、前回と同しプログラムを 使うことにします。 % cat a. c main(argc , argv) int char DTK COMPUTER SPARC 機フルコンパチブル DTKCom*Jter 社は SPARC メンバーの一員です。 Station 2GX ・・・・・・・¥ 1 , 498 , 000 SPARC 旧 40MHz HDD 424MB lnside SPARC PFU 40MHz SO [ S 1 .0.2 CRT 20- Color Philips RAM 16MB 中古機も取扱。下取りも承ります。 ・ Y498 , 000 SS-2 Main Board ・・ ・・ Y248 , 000 GX Board ・・ ・・ Y98 , OOO CG3 Board ・・・ RAM 4MBx4 ・・ J-Keyboard 各種ポード、周辺機器を 107-Keyboard Mouse ( メカニカル ) 豊富に取り揃えております。 16 / 20 inch Monitor HDD 各種 お問い合わせください。 Q ℃ -150 Drive 旧 M 腐 compatible 486-50MHz Machine FEAT5031 256K Cache, 8MB RAM S-VGA 14 “ Color Monitor Japanese Keyboard 3.5 “ & 5.25 ” FDD HDD 120MB IDE ・・・・・ Y598 , 000 HDD 200MB IDE ・・・・・ Y675 , 000 HDD 320M B SCSI••・ Y 774 , 000 HDD 676MB SCS ト・ Y894 , 000 こ使用のマシンが SS2 に変身 ! argc ; * * argv ; int 1 ; for (i = atoi(* + + argv) ; i く atoi(* 十十 argv) ; 十十 ) TEL.03-3255-5669 X. 03-3255-56 / 9 〒 101 東京都千代田区外神田 3 ー 10 ー 7 第 2 北沢ヒル 4 階 株式会社マイワロワラフト ソフマップ 8 号店ヒルの 4F です。 printf ("%d\n" , sum) ; % cc —g a ・ c % a. out 1 10 Segmentation fault (core dumped) このプログラムは、 for 文の条件判断で argv の値を 中部地区・浜松営業所 TEL. 053-576-5377 資料請求 N 。 129 UNIX MAGAZINE 1992.10

5. UNIX MAGAZINE 1992年10月号

き換えます。 連載 /UNIX Communication Notes イ 4 喋にかかる時間はおそらく数時間におよぶ ( そのうち mkhistory の完了待ちがもっとも長い ) ので、十分な時 間があるときに作業を開始します。 インストールを手早くするため、 nntpd システム UNIX MAGAZINE 1992.10 Mkhistory で history を完全に再構築してください。 手で取り除ければいいのですが、面倒ならあとで述べる 終了します。この場合は重複を取り除く必要があります。 て、同し記事が複数回 history に現れると、 dbz は異常 Bnews で dbm データベースが壊れたまま運用してい で、 dbz データベースを作ります。 /usr/lib/newsbin/dbz /usr/lib/news/history おせばとりあえす使えます。つまり、 タベース (history. dir 、 history. pag) さえ dbz で作りな Cnews の history は Bnews と上位互換なので、デー history は、こオび人降もできるだけ手早くおこないます。 を変換するイ 1 喋をおこないます。ロックした状態でのイ 1 璞 news で Cnews システムをロックしてファイルの形式 ースの着信を停止し、 /usr/lib/newsbin/maint/lock- ます、すでに説明したようにほかのホストからのニュ ファイルは操作する必要がありません。 も同じです。 /usr/spool/news の下にオ内された記事の ニューススプールの冓造そのものは、 Bnews も Cnews めのイ乍業について説明してゆきます。 関しては Bnews のものを引き継ぐべきでしよう。このた ってしまい読者が困ります。そこで、ニューススフ。ールに 用してしまえば楽なのですが、それでは記事の番号か変わ 捨て、テストで作られた Cnews のスプールをそのまま採 イ乍業の手間を考えると、 Bnews のニューススプールを ま残っています。 sys 、 active 、 mailpaths などは Bnews のものがそのま 残されます。したがって Cnews をインストールしても /news) の既存のファイルは、置き換えられすにそのまま Cnews をインストールする際、 NEWSCTL(/usr/Iib (doit. bin (i) だけはさきに終えておきましよう。 のコンノヾイル、 SRC/conf/build の実行とコンノヾイル act ive 第 2 、第 3 フィールドの桁数を増やせは、 Cnews 用の active になります。 cd /usr/lib/news mv active active . bnews しくおこなわれません。一律に記事 1 つにつき 3 000 バ 受け付けます。ただし、記事の大きさについては計算が正 NEWSBIN/batch/batchsplit は Bnews 形式の入力も とします。 Cnews のものとファイル形式が異なりますが、 /usr/spool/news/out ・ going/wazuka/togo cat vazuka. work wazuka > > \ があったとすれば、 たとえば、 wazuka と wazuka. work というファイル ます。 は、対応する out. going の下に togo という名前で置き か、あるいは /usr/spool/news/batch にあるはすです ) Bnews の記事リストファイル (/usr/spool/batch てます。 /usr2/spool/cnews/out. going の togo と togo. * は ときは、 /usr/spool/news/out ・ going/ の下に移します。 going の下に作成したファイル (viauux など ) がある を作成します。また、もしも /usr2/spooI/cnews/out. /usr/spool/news/out. going の下の各ディレクトリ NE 、 VSARTS/out ・ going ないます。 ある場合には、 /usr/lib/newsbin の下で同し竹喋をおこ /usr2/lib/newsbin の下で変更・追加したファイルが newsgroups は Bnews のものがそのまま使えます。 からコピーしてくればよいでしよう。 explist 、そして batchparms などは、 /usr2/Iib/cnews sys 、 mailpaths 、 localgroups 、 newgroupperm 、 そのほかの言聢ファイル aliases > > active awk '{print $ 1 , ” 0000000000 0000000000 " , " = " $ 2 } ' \ active . bnews > active awk '{printf "%s % 010d % 010d %s\n" , $ 1 , $ 2 , $ 3 , $ 4 } , \ イトとして扱われます。 57

6. UNIX MAGAZINE 1992年10月号

バッグするには、 いでしよう。 とりあえす dbx を利用するはうがよ テパッガを使うための知識 デバッガをうまく使うためには、次の 2 つのことを 知っておかなくてはなりません。 シンポノレテーフンレ ・コアファイル シンポルテープルとは、 dbx を使ってプログラムをデ バッグするときに必要な情報で、通常のコンパイル方法 ではフログラムには組み込まれません 2 。そのため、プ ログラムをコンパイルする段階で一 g オフションを指定 し、このシンポルテープル情報をプログラムに組み込ま なければならないのです。つまり、これまで、 % CC a. C としてフログラムをコンパイルしていたものを dbx で % cc -g a ・ c デバッグするには、 UNIX MAGAZINE 1992.10 テープルは、 こで説明する去で組み込む必要があります。 2 シンポルテープルは組み込まれますが、デバッグ用の特別なシンポル きどき作ってしまったことがあるのではないでしよう もう 1 つのコアファイルですが、これは皆さんもと ことが多いので注意しましよう。 最後のリンクの段階での一 g オプションは、付け忘れる とした場合では、作成されるプログラムも異なります。 % cc -g a ・ 0 % cc —g -c a ・ c とした場合と、 % CC a. 0 % cc -g —c a ・ c ります。つまり、 形式のプログラムを作成するときも指定する必要があ きはもちろん、オプジェクト・ファイルから実行可能 オプションは、オプジェクト・ファイルを作成すると とコンパイルしなければなりません。 cc コマンドの一 g LJN Ⅸ流プログラミング 24 か。前回、誤ったプログラムを作成して実行したとき、 シェルから、 % a. out 1 10 Segmentation fault (core dumped) のような出力が得られました。この場合、括弧のなかに core というファイルが作成され 書かれているように ています。これがコアファイルです。 このファイルには、プログラムがエラーで止まった ときのプロセスの実行イメージが↑褓内されています。デ バッガは、このファイルを利用してプログラムが停止し た原因を調べます。ただし、 ls ー 1 を実行してみると分 かるとおり、このファイルはかなり大きなものです。 % IS ー 1 a. out core —rwxrwxr—X 1 image 1 image 24576 Aug 1 15 : 11 a. out 8413616 Aug 1 15 : 19 core 実行可能形式のフログラムは 24KB しかありません が、 c 。 re ファイルはその 300 倍以上もの大きさになっ ています。 このように、不注意から大きなファイルをたくさん作 ってしまわないように、 csh を使っているときは limit コマンドでコアファイルの大きさを制限していること があります。次のコマンドを実行してみてください。 % 1imit coredumpsize 0 kbytes coredumpslze この例の 0 kbytes は特殊なケースで、どのような 場合にもコアファイルを作らないように制限していま す。この段階でさきほどのプログラムを実行しても、コ アファイルは作成されません。 このままではコアファイルは得られないので、大きさ の制限を緩めておきましよう。次のようにすると、コア coredumpsxze unlimited % 1imit coredumpsize % unlimit coredumpsize ファイルがかならす作られるようになります。 127

7. UNIX MAGAZINE 1992年10月号

DZ--XN#Äログラミング テ′ヾッカ 前述のように、デバッガはデバッグを目的として作 成されたプログラムで、前号でのたとえにならえばハ ェ叩きもしくは殺虫剤にあたります。ただし、自動的に デバッグしてくれるわけではなく、どこがバグかを判断 するのは人間です。そして、それをどのように修正すれ はよいかを考える手助けをするのがデバッガです。つま り、プログラムを渡せは勝手にバグを取り除いてくれる ものではないのです ( ハエ叩きが勝手に動いてゴキプリ を退治していたら・・・・・・ちょっと怖いですね ) 。 しかし、デバッガを使えば、プログラムを実行しなが らさまざまな変数の値を見たり、プログラムの実行過程 を追うことができます。変数の値が正しく設定されてい るかを調べながらプログラムの実行過程をみていけば、 プログラムが期待どおりに計算しているかどうかを確 認することができます。 一般的なデバッガでは、 1. 工ラーの発生した箇所の表示 2. 変数の値の表示や変更 3. プレークポイントの設定 4. プログラムのトレース などがおこなえます。 1 は、セグメント違反やバスエラーなどでプログラム が停止してしまった箇所のことです。つまり、プログラ ムがうまく動かなかった場合、どこでプログラムの実行 前回は、 printf を使ったフログラムのデバッグ方法に が停止してしまったかを知ることができます。 ついて説明しました。この方法はたしかに手軽ですが、 UNIX には、 adb や dbx などのデバッガか驃準で 用意されています 1 が、今回は dbx をとりあげます。 見たい変数が変わるごとにプログラムを再コンパイル しなければならないので、かなりの手間がかかります。 れはおもに BSD 系のマシンで使えるもので、プログラ そこで今回は、より効率的にプログラムをデバッグ ム中の変数や関数名をそのままデバッグに利用したり、 するためのツール デパッガを紹介しましよう。デ ソースプログラムの実行を 1 行ごとに制御することが バッガは、その名が示すとおりデバッグを目的として作 できます。 成されたプログラムで、プログラムを修正せすに printf 一方、 adb はほとんどの UNIX マシンに実装され テンヾッグと同様なことができます。 ていますが、アセンプリ・レベルのデバッガなので、や なお、デバッガは複雑な ( ? ) システムなので、数回 や使いづらいところがあります。たしかにそオ材目応の使 にわたって説明する予定です。 いやすさもあるのですが、自分で書いたプログラムをデ 1 これらのデバッガが用意されていないマシンもあります。 man -k debug などとして、確かめてみてください。 24 今泉貴史 126 UNIX MAGAZINE 1992 ユ 0

8. UNIX MAGAZINE 1992年10月号

連載 完了待ち PS gx UNIX Communication Notes— などとして、 rnews -U や expire が動いていないか確 かめましよう。重川乍中のときは、完了するまで待ちます。 rnews -U は kill してもとくに害はありません。 テスト用Ⅱ ntp のインストール nntp を使っているのなら、並行して nntp のテストも おこなう必喫があります。 Cnews と同様に、 Bnews 用の nntp システムと競合しないディレクトリにインストール します。 common/conf. h も、仮の Cnews が使っているディ レクトリに合わせて編集しなけれはなりません。 それから nntpd を作るときには、 dbz. 。を忘れすにリ ンクしましよう。間違って dbm ( 標準 C ライプラリに 含まれている ) をリンクしてもその場ではエラーは出ませ んが、 Cnews が作る dbz データベースをアクセスできま せん。 Cnews と nntp の動作確認 本格運用時と同しだけのニュースを受け取っている状況 で、 Cnews のテストを続行します。 nntpsend によるニュース送信のテストもおこないま す。 nntpsend などの nntp 付属のスクリプトは、 /usr/ spool/news/batch などのディレクトリが内部に書かれ ているので、手て修正する必要があります。 nntpd のテストは、 nntpd の本来のものではないポー トに一判勺にこの、、仮の Cnews 対応の nntpd" を割り当 て、ほかのホストから telnet でテストします。とりあえす これを、 /etc/nntpd. cnews という名前だとしましよう。 まず、 /etc/services にポート番号を登録します。 NIS を使っている場合にはサーバーで登録しなければなりませ ん。たとえば、次のようにします。 nntptest 11900 / tcp 11900 という数には意味はありません。使っていない、 大きめの番号ならなんでも OK です。 次に、 /etc/inetd. conf に /etc/nntpd. cnews を登録 します。 たとえば SunOS の場合は、 UNIX MAGAZINE 1992.10 stream tcp nowait root /usr/etc/nntpd nntpd nntp nntptest stream tcp nowait root /etc/nntpd. cnews nntpd というようになります。 inetd. conf の書式は OS によってすこしすっ異なるの で、このリストをそのまま書き込んではいけません。既存 の nntpd の行を複製してポート名を nntptest に、プロ グラムのパス名 (/usr/etc/nntpd などになっているは す ) を /etc/nntpd. cnews に変更してください。 これで、 inetd に SIGHUP を送ると、登録か完了し ます。 そこでほかのホストから、 telnet テスト中のホスト名 11900 として nntpd. cnews に接続してみます。 接続しているかどうカ蔀寉認し、さらに article く BszBy3.Gqy@nadia. cs . naniwa—u ・ ac ・ jp> というように、 Message-ID から記事を検索するようなコ マンドを与えてみてうまく働くかどうかを調べます。 図 1 か確認イ乍業の例です。アンダーラインの箇戸励ゞキー 入力の部分です。ます、 Cnews の運用テストをおこなっ ているホスト nadia でテストのための記事を naniwa. test に投稿し、別のホスト wazuka からそれを読み出し てみています。 そのほか、 sendbatches で記事がうまく送れるか、 ex- pire が正しくおこなえるかなどを確認します。 仮の NEWSARTS に割り当てたファイルシステムの 容量から考えて、それを溢れさせない期間で記事を消すよ うに、 explist を設定します。容量の限界より短い期間に 設定するぶんにはとくに問題はありません。ディスク容量 に余裕があるからといって保存期間を 2 週間に設定する と、 expire の動作テストは 2 週間経たなければできない ことになります。 sendbatches を本番どおりに動かしてしまうと、隣接 サイトに Bnews と Cnews の双方から記事が送られ、 トラフィックが ( 電言辞十金が ! ! ) 倍になってしまいます。 sendbatches の起動は、正常な動作を確認する程度にし ておきましよう。ただし、 sys を本番どおりに設定してお いて sendbatches を起動しないで放っておくと、ニュー スシステムから、、記事の送信が詰まっている " という警ロ 55

9. UNIX MAGAZINE 1992年10月号

連載 /UNIX Communcation Notes 図 2 mkhistory の告 * * * 53 , 56 * * * * 53 , 56 ) のシングルクオートの中身はタブてす。 Mkhistory Sat Aug 15 18 : 19 : 36 1992 * * * mkhistory Sun Jun 14 23 : 15 : 45 1992 find $them —type f —name ' [ 0 ー 9 ] * ' —print ー histinfo ー sort awk sort sort $SORTTMP —t , —f $NEWSBIN/expire/histdups ー histslash >$NEWSCTL/history. Ⅱ find $them —type f —name ' [ 0 ー 9 ] * ' —print ー histinfo ー $SORTTMP ー awk —f $NEWSBIN/expire/histdups ー $SORTTMP -t , ) + ln ー histslash >$NEWSCTL/history. n 不要ファイルの消去 くのあいだは、 Cnews システムの動きに注意して、頻繁 Cnews への移行・作業はこれで完了です。移行後しばら のも忘れないようにしましよう。 す。 Cnews の SRC/conf で make gclean をおこなう Cnews の . 。ファイルなどは糸数メガバイトになりま などのファイルは、忘れすにもとに戻しておきましよう。 テストの過程で変更した /etc/services 、 inetd. conf ディレクトリを内容も一赭に消してしまいます。 /spool/news/. bad 、 /usr/spool/news/. tmp といった /usr2/lib/newsbin 、 /usr/spool/news/. rnews 、 /usr それから、 /usr2/spool/cnews 、 /usr2/lib/cnews 、 (aliases 、 seq 、 uurec など ) を消去します。 最初に、 /usr/lib/news に残っている不要なファイル Bnews 、テスト用の Cnews 、 nntp 環竟を消去します。 history の保守 に確認してください。 UNIX MAGAZINE 1992 ユ 0 データベースを操作しているときにシステムダウンか起こ 込むことで効率を上げているので、 relaynews が history ています。 dbz はデータをキャッシュし、まとめて書き Cnews は、 dbz ライプラリの使用によって効率を高め 1 つです。 ニュースシステムを運用するうえでもっとも大切なことの history データベースが壊れないように管理するのは、 ると history と history. dir 、 history. pag の対応に矛盾 が生じることがあります。 停電や、 UNIX カーネルの panic によるダウンなどの 事故か起きたら、リプート直後に history データベースが 壊れていないかどうか調べてください。 . dir 、 . pag とのあいだに矛盾がないかを調べるには、前 回説明したように dbz ー c を使用します。ただし、書き換 えているときに検査したのでは、矛盾がある " と誤認する ので、ニュースシステムをロックしてから調べます。 cd /usr/lib/news /usr/lib/newsbin/maint/locknews /usr/lib/newsbin/dbz —c history もし、エラー・メッセージが出力されたら、 /usr/lib/newsbin/dbz history として明冓築します。記事の二重登録で再構築に失敗した ら、 mkhistory か Mkhistory を使って直します。 mkhistory はニュースシステムのロックをそのなかで おこなっているので、ます、 ニュースシステムのロック を解除してから実行しなければなりません。 ☆ これで、ひとます Cnews の解説を終ります。今後、 Cnews の大皜なバージョンアップがもしおこなわれたら、 そのときにまたとりあげる予定です。 59 ( さいとう・あきのり大阪大学 )

10. UNIX MAGAZINE 1992年10月号

連載 /UNIX Communication Notes—O Bnews 起源の togo が残っているあいだは、 send- batches で送出される記事バッチのサイズと batch- parms で窈旨定との誤差が大きくなってしまいます。 nntp nntpd など一式を、 Cnews 対応のものに入れ替えま す。あらかじめ、コンパイルだけはすませておくと作業が 速く進みます。 こまで竹ミ業が進んだら、 exit して Cnews システムの ロックを解除します。 uuxqt や nntpd などの動作も再開 してかまいません。また、これ以降の作業は、ゆっくりお こなってもあまり被害はありません。 理記事 /usr/spool/news/. rnews 、 /usr/spool/news/. ⅱト com 、 /usr2/sp001/cnews/in. coming にファイノレか汐戈 っていたら、 rnews の標準入力に与えてから消去します。 done rm $file rnews く $file while read file ;do -type f print ー /usr2/sp001/cnews/in. coming /usr/spool/news/. incom find /usr/spool/news/. rnews # ! /bin/sh newsrun を手で実行して、正しく処理されることを確 れるはずです。 していれば一方だけが受け入れらオ L 、 2 回目以降は捨てら coming に入るかもしれませんが、 history の変換に成功 これにより、同一の記事が 2 つ /usr/spool/news/in. 認します。 58 そのなかに /usr2/lib/cnews などのパス名か書き込まれ す。テスト運用中の設定ファイルなどをコピーしたとき、 を newsrun で処理できているかがもっとも重要な間題で します。記事の投稿と、はかのシステムから着信した記事 まず、 Cnews システムが正しく動作しているかを確認 整をおこないます。 ので、これまでコピーしてきたものをもとに設疋の最終調 /usr2/lib/cnews/lib の設定は運用テスト用の設定な テストと最終など ていないかどうか十分に注意してください。もしあれば、 /usr/lib/news など、本格運用時のディレクトリに書き 換えておかなければなりません。 とりあえす、 dbz データベースの再構築だけをおこなっ た history ですが、これはあくまでも、、なんとか使える " というレベルのものです。 expire を (doexpire 経由で ) 実行すると、 history は Cnews 形式に書き換えられます が、安全のためには積極的に、 NEWSBIN/expire/mkhistory を使って history をスプールの内容から : 叫冓築します。ホ ストの能力とニューススプールに溜まった記事の量により ますが、これにはかなり長い時間がかかります。 history データベースが壊れていると二重着信か検出で きす、同じ記事が複数のスプールにオ内されてしまうこと もあります。この状態で mkhistory を実行すると、 dbz でデータベースを作成するところで失敗してしまいます。 mkhistory をもとに図 2 で示す改造を施し、 Mkhis- tory を作ります ( 名前はなんでもかまいません ) 。 ま $Message-ID でソートしたあとクロスポスト ( と 重複 ) の処理をし、到着時刻順にソートしなおしてから history を作ります。これは sort を 1 回よけいにおこ なうぶん mkhistory より効率は悪いのですが、スプール 中の記事が重複していても dbz データベースを作ること ができます。本来は重複した記事はスプールから削除した ほうがいいのですが、とりあえす Mkhistory で対処して おけはそのうち記事が expire してしまいます。 仮の運用ということで、 /usr2/Iib/cnews/explist に は短かめの期間か書かれていたと思います。これを /usr /lib/news にコピーしてきた段階で、本来のスプール容 量に対応する期間に書き換えます。 /usr/lib/newsbin/ spacefor も同様です。 Bnews とテスト運用に関する cron の登録をすべて消 去しにの竹喋中はすでに消去あるいはコメントアウトの 状態になっているはずです ) 、 Cnews 用の設定をおこな います。 NEWSBIN/maint/newsboot をプート時に実行する 設定 (/etc/rc.local などでおこないます ) も忘れないよ うにしましよう。 UNIX MAGAZINE 1992.10