図 10 FTP でのコネクションの言聢方向 (a) 通常の FTP でのコネクションの言聢 ftp ( 21 ) FTP サーバー FTP クライアント ftp-data ( 20 ) ーロ (b) passive FTP によるコネクションの言聢 ftp ( 21 ) FTP サーバー FTP クライアント ftp-data ( 20 ) passive FTP FTP では、 2 つの TCP コネクションを利用する。 1 つ インターネットで使われているアプリケーション・プロ トコルの多くは、人間か読める形式でメッセージを出力する。 は、 FTP クライアントがサーバーに接続し、コマンドを HTTP や SMTP 、 POP3 、 IMAP4 、 NNTP など、日常 交換するためのコネクションである。このとき、サーバー 的に利用するアプリケーションか使っているプロトコルについ 側では TCP ポート 21 番を使う。このコネクションは、 ても同様である。このため、サーバーをプロトコルレベルでデ バッグする場合、すくなくとも telnet さえあれは重川何忍が クライアント側からサーバーに対して設定される。ところ できる。 が、ファイル転送においてデータをやりとりするための、 TCP ポート 20 番を使うコネクションは、もともとの設 FTP 計ではサーバー側からクライアントに対して張るものだっ ftp は、インターネット上でファイルを転送するための た ( 図 10- a ) 。 10 年ほど前まではこのような設引でもよ プログラムである。しかし、はかのプログラムと同様 : ンヾ かったが、その後の環境の変化によって次のような間題が スワードか漏れる危険匪があり、山も丘はあまり使われなく 出てきた。 なってしまった。しかし、 anonymous FTP の機能を利 用した FTP アーカイプは依然として多く、重のソフト ・あいだにファイアウォールがある場合、ファイル転送 ウェアの配布に使われている。このように、 ftp は従来と のための TCP のコネクションは、外部のインターネッ は異なる場面で使われることがある。 トから内部ネットワークに向けて設定される。通常の ftp コマンドを利用する場合は、引数に FTP サーバー セキュリティ・ポリシーでは、外部から内部へのコネク のホスト名を指定して起ける。 ションの確立は、ファイアウォールで阯にすることが多 い。ということは、ファイアウォールがある工竟では、 % ftp ftpserver. f00. com このようなコネクションは確立できないことになる。 このようにすると、 FTP サーバーにフロトコル FTP ・ NAT (Network Address Translator) 機能をもつ を用いて接続し、対話式の処理でファイルを医できる。 機器が中間にある場合には、データ転送用コネクショ 39 UNIX MAGAZINE 2001 ユ 2
連載 IPv6 の実装ー 3 図 3 重複アドレス検出の手順 ( パターン 2 ) た場合です。ノード A とノード B は同一のリンクローカ ル・アドレスを割り当てようとしているので、両方とも同 じ要請マルチキャスト・アドレス X 宛のバケットを受信 します。この例では、ノード A がノード B よりもさきに 近隣要請バケットを送信するため、ノード B は自分のア ドレスか重複していることを知ることができます。ノード B 以外に、同一リンク上でノード A と同じリンクローカ ル・アドレスを利用しているノードがなければ、ノード A の近隣要請に対する近隣通知はおこなわれません。最終的 に、ノード A がリンクローカル・アドレスを使うことに なります。 今度は、両方のノードがたまたま同時に近隣要請バケッ トを送信したとしましよう。すなわち、図 3 の 1 と 2 の 通信か 1 司時に発生した状況です。この場合、両者ともに相 手が送信した近隣要請を受信するので、結果としてどちら のノードも重複を検出してしまいます。これが最悪のシナ リオで、こうなると、たとえこの 2 つのノード以外に同し アドレスを使っているノードがなかったとしても、各ノー ドは利用しようとしているアドレスか重複していると判断 し、そのアドレスを使わないようにします。この場合、手 動での対応が必要になります。 たいていはこの手順で重複アドレスの検出ができます が、重複アドレス検出の手順はかならすしも完璧ではあり ません。たとえば、ネットワークが分断されていたりする こて規定されているアルゴリズムではアドレスの重 と、 複を本剱日できません。あくまで、管理の補助として利用す る仕組みと考えてください。 ノード B ノード A 近隣要請 要請マルチキャスト・アドレス X ト・アドレス X を、同しリンクローカル・アドレスを利 用しているノード B も受信します。ノード B はノード A からの近隣要請を受信し、ノード A が重複したアドレス を利用しようとしていることを知ることカ、きます。この とき、ノード B は、ノード A に重複を知らせるために近 隣通知バケットを送信しなければなりません ( 図 2 ー 2 ) 。し かし、この時点ではノード A に有効なアドレスがまだ割 り当てられていないので、ノード B がノード A に重複を 直接知らせることは不可能です。そこで、 IPv6 の全ノー ド・マルチキャスト・アドレスを利用します。ノード A は、ノード B が全ノード・マルチキャスト・アドレスに 向けて送信した近隣通知バケットを受信し、自分が使おう としているアドレスか重複していることを知ります。 ノード A がどのノードからも近隣通知を受信しなけれ ば、同しアドレスを利用しているノードはないと考えられ ます。この場合、ノード A はこのリンクローカル・アド レスをそのまま使い続けることができます。 以ーヒは、同じアドレスをすでに使っているノードか同一 リンク上にあった例です。もう 1 つ考えておかなければな らないのは、同時に複数のノードがリンクに接続し、しか も同じアドレスを割り当てようとしたケースです。図 3 の ような状況を考えてみましよう。 この状況は、タイミングによってさらに 2 つの場面に 分けられます。 ・どちらカ・方のノードがさきに近隣要請バケットを送信 した場合 ・両方のノードか 1 司時に近隣要請バケットを送信した場合 ます、前者から考えてみます。たとえば、ノード A が ノード B よりもさきに近隣要請バケットを送信したとし ます。つまり、図 3 の 1 の通信が 2 よりもさきに発生し サイトローカル、グローバル・アドレスの 自動設定 いったんリンクローカル・アドレスか、定できたら、さ らに有用の広いサイトローカルおよびグローバル・ア ドレスの自動設定に進みます。もちろん、単一のリンクし か存在しないネットワークではこれらの設定は不要です。 リンクローカルとは異なり、サイトローカルおよびグロ ーバル・アドレスの場合は、プレフィックスと呼はれる ネットワーク識別子が上位ピットに含まれています。し たがって、ノード自身の情報だけではアドレスを決定でき ません。プレフィックスの情報は、各ネットワークに接続 62 UNIX MAGAZINE 2001.12
連載 /Cyber Kansai Project—・ 図 7 作成ファイルの検列 DIR *dirp; struct dirent *dp ; while (dirp) { errno = 0 ; if ( dp = readdir(dirp) ) { if (strstr(dp—>d—name, else if (strstr(dp— >d_name else if (strstr(dp _name , else if (strstr(dp _name , dirp = opendir( "/koshien/scene/010822/01—01B" ) ; ← 8 月 22 日第 1 試合 1 回裏 ← ( 1 ) アイコン画像検索 ← ( 2 ) テキストファイル検索 ← (3)SMIL ファイル検索 ← ( 4 ) SMIL テキスト検索 し rt " ) ) else { closedir(dirp) ; ←検索終了 if ( ( 1 ) ~ ( 3 ) が真かっ ( 4 ) が偽 ) ← rt ファイルのみ存在しない場合 ← SMIL ファイルを作成 Create—SMIL( ) ; 図 8 カーネ ) レモニター・システム レイヤ 2 スイッチ WWW 1 モニター 1 レイヤ 4 スイッチ ネットワーク 1 WWW 3 モニター 3 レイヤ 2 スイッチ レイヤ 2 スイッチ 朝日放送 アップロード / 内部ネットワーク illllllh WWW A モニター A レイヤ 2 スイッチ レイヤ 4 スイッチ ネットワーク 2 (CKP) WWW D モニター D レイヤ 2 スイッチ レイヤ 2 スイッチ ログモニター用ネットワーク i 三 ==ー グラフィックス・ホスト ・カーネル時間率 ( カーネル内部で処理している割合 ) ・ユーサー時間率 (CPU がユーザープロセスを処理して いる割合 ) ・コンテキスト・スイッチ数 (CPU で 1 秒間にコンテ キスト・スイッチ ( プロセスの切替え ) が三している 回印 ・応コネクション数 ・タイムスタンプ マルチプロセス・システムの場合は、 CPU ごとに以下 の項目のモニタリングが可能になっています。 ・アイドル時間率 (CPU のアイドル時間 ) 174 UNIX MAGAZINE 2001.12
図 12 パッフアが空の場合 #define ring—empty(d) (((d)->consume = = (d)->SUPPlY) & & \ ( (d)—>consumetime > = (d)->supplytime) ) 図 13 パッフアが一杯の場合 (d) → consume) & & \ #define ring-full(d) (((d)¯>supply ((d)->supplytime > (d)—>consumetime) ) とであれば、これもバッフアか空であるとみなせます ( 図 逆に、消費した時刻よりも登録した時刻があとであれ は、バッフアは一杯であると判断できます ( 図 13 ) 。 次は、リングバッフアをネ加月化するための ring-init 関 数です。この関数を呼び出す場合には、あらかしめ Ring 構造体を構築しておき、そのアドレスを引数として渡しま す。さらに、対応つける領域のアドレスとサイズを指定し ます。 ring—init(ring, buffer, count) Ring *ring ; unsigned char *buffer ; int count ; 12 ) 。 memset ( (char *)ring, 0 , sizeof *ring) ; ring—>size C ount ; ring—>supply = ring¯>consume ring—>bottom = buffer; ring—>top = ring¯>bottom 十 ring¯>size ; return 1 ; 構造体の size フィールドをサイズに設疋し、 supply 、 consume 、 bottom をすべて領域の開始アドレスに設定 します。また、 top は或を超えた場所に設定しておきま す。注意してほしいのは、 consumetime や supplytime を 0 に設定していない点です。これらは、構造体の領域を 確保したときに 0 になっていると仮定しているため、この 関数では初期化していません。 ring-mark は、最後に登録したデータにマークを設定 するための関数です。 実際の処理としては、 ring-decrement マクロを使っ て、 mark の値を登録用ポインタの直前の位置に設定しま す。また、 ring-at-mark は取得用のポインタがマークを 指しているかどうかを調べます。 ring-clear-mark はマー クを消去するための関数です。 ring-supplied と ring-consumed は、リング / ヾッファ に対してデータの j 助日や取得をおこなったときにポインタ の位置を髜各するための関数です。 ringsupplied は、リ ングの位置をインクリメントして supplytime を調整す る処理をおこなっています。 ring-consumed のほうは、 mark の処理も加わるためやや複雑です。 VOid ring—consumed(ring , count) int c ount ; Ring *ring ; if if ( c ount 0 ) / * don ) t update anything * / VOid ring-mark(ring) Ring *ring; ring¯>mark 74 rlng— decrement (ring , - ring¯>supply , 1 ) ; ( r ing— >mark & & (ring-subtract(ring, ring¯>mark , ring¯>consume) く count) ) { ring¯>mark = 0 ; ます、指定された大きさが 0 でないことを石忍します。 UNIX MAGAZINE 2001.12 を登録して処理を終了します。 に、 consumetime に現在の日リ ( 実際にはイベント番号 ) increment を使って進めた先の位置を計算します。さら 次に、実際に読出し用のポインタを進めるために ring- クをクリアしておきます。 マーク自身カ甘旨すデータを読み出すことになるため、マー べます。指定された量のデータがない場合、けっきよくは いだに指定された量のデータか存在しているかどうかを調 ークか疋されている場合、マークと読出しポインタのあ 次に、マークが設定されているかどうかを石忍します。マ 0 であれは何もすることがないので、関数を終了します。
連載 /Cyber Kansai Project— 図 11 携帯舌へのメールによるミロ HTTP GET インタネット sendmaill HTML アップロード Warning xyxx@yyyy ・ ne ・ P ◎ 0 ローカルサーバー warning@koshien. asahi . CO . jP Web サーバー 不規則になりがちで、お世辞にも・商な竟とはいえない のではないでしようか。 甲子園のインターネット中継も、昨年まではこれと大差 ない工竟でした。しかし、システムの安定化とモニターシ ステムの確立によってすいぶん改善さオ L 、現場を離れるこ とも可能になりました。その場合、どのようにしてシステ ムの稼動伏況を把握するかか重要になります。今回は、携 帯電話のメールを利用することにしました。 甲子園サーバーでは、朝日放送の社内システムにより、 得点情報などが自重加勺に更新されるようになっています。 しかし、試合中にもかかわらず得点や選手情報か更新され ていない ( コンテンツ作成、アップロード・プログラムの不 調 ) 、正しくダウンロードできない ( サーバーやネットワー クの不調 ) といった不具合が生じる可能生もあります。そ こで、コンテンツのアップロードおよびダウンロードの絶 対日判りを上交し、不具合があった場合は携帯電話にメール で通知するイ督目みとしました ( 図 11 ) 。このため、アップ ロード時に以下のような時間情報を挿入します ( 数値は、 time システムコールで求めた工ポックタイムです ) 。 く META HTTP—EQUIV="x—time" CONTENT = 998460834 > メールは、図 12 のプログラムで送信します。 おわりに 今回は、 CKP の実証実験における甲子園インターネッ ト中継の新システムの概要を紹介しました。年を追うごと ードウェアは小型になってきていますが、システムの 規模は増大する一方であり、その本像を把握するのは容 易なことではありません体来なら、実際にアクセスして 176 図 12 携帯電話へのメール酉言プログラム FILE *pip time_t tn ; fprintf (pi0 , "Subject : Check Server\ni') ; fprintf (pip, "To: xxxx@yyyy ・ ne ・ jp\n") ; fprintf (pip , "From : warning@. pip = popen( "/usr/lib/sendmail" fprintf(pip,"\n") ; tn = time(NULL) ; fprintf (pip, "%s\n" pclose(pip) ; ←ヘッダ部終了 ←工ポックタイム asctime(&tn) ) ; 使い心地などを実感していただけ川まいいのですが、運営 上の都合てサイトは 8 月 31 日をもって終了しています ) 。 Windows などの OS で動く PC の普及は、上位システ ムを扱う UNIX 管理者には頭の痛いところです。しかし、 ほかのシステムとの ; 叫秀を考えると、現大では避けて通れ ない道ともいえます。事実、今回のインターネット中継で も、今年からスポーツ中継のデータベースが Wind 。 ws シ ステムに切り替わり、最初はどうなることかと思いました が、共通インターフェイスの導入によって安定したシステ ムを構築することができました。 次回は、アップロードのイ督はみとサーバーを中心に、も うすこし技術的な観点から解説する予定です。 はしだ・とよかす朝日放送、 なかむら・ゆたか大阪大学 ) UNIX MAGAZINE 2001.12
図 10 リングパッファ上て加減算をおこなうマクロ #define ring—decrement (), a , c) #define ring—increment(d,a,c) #define ring-subtract (d , a, b) #define ring—increment (d , a, c) 図 11 変更した ring-increment マクロ UNIX MAGAZINE 2001.12 ています。 ルの樹冓を使ってコメントアウトする方法がよく利用され め、ほかのコメントの存在に景グを受けない牛コンパイ だからです。このように、コメントは入れ子にできないた 規則が、、 / * " て始まり、、 * / " で終了するという簡単なもの マークのところでエラーになります。これは、コメントの C はコメントの外側となってしまい、最後のコメント終了 ロ、 point A は正しくコメントアウトできますが、 point むかたちでコメントアウトしようとした状態です。この場 上記の例は、 point B がもとのコメントで、それを囲 point C point B point A いすれもリングバッファ [-. の演算になるので、結果か領 減算です。これらの結果はポインタになります。 数値の加算、 ring-decrement はホインタに対する数値の れるかを返します。 ring-increment はホインタに対する だて減算をおこない、ポインタ間にどれだけの領域が含ま ロです ( 図 10 ) 。 ring-subtract は 2 つのポインタのあい 最初はリングバッファ上で加疆巐 : をおこなうためのマク ring. c ファイルに褓内されています。 次に、ソースコード本体をみていきましよう。こちらは ring. c ファイル おこなうと、おかしなことか起きてしまいます。 部分を囲むかたちでコメント記号によるコメントアウトを ている可能生があるためです。すでにコメントか存在する は、コメントアウトしたい部分に通常のコメントが使われ プログラミング・テクー ーック るためです。また、登録した時刻よりも消費した時刻があ リングバッフアの初期他時 , にどちらの値も 0 となってい 登録されていない状態なので空と判定できます。これは、 sumetime と supplytime か等しけれは、まだ何も値が バッフアは一杯になっているか空のどちらかです。 con- consume と supply が同し場所を指している場合、 空かを決定できます。 いると、次のようにしてバッフアカ立一杯なのか、それとも このように、値を登録したり消費した時刻か第当求されて static u—long ring—clock = 0 ; べての値のあいだで前後関係を決定できるようにします。 たびに r ⅲ g ー cl 。 ck の値をインクリメントすることで、す に↑褓内する値をイ尉寺するものです。これらに値を代入する グノヾッフアを表づ才冓造一本の supplytime や consumetime 次にクロックの亘暠をおこなっています。これは、リン 内に収まります。 め、ポインタに対する演算の結果はかならす確保した領域 このガ去では、ポインタに加える値をさきに言算するた すれば、このような間題は起こらなくなります。 ことになってしまいます。この定義を図 11 のように変更 で各します。これではヨ判勺に不適切なポインタを扱う (a) + (c) で範川タ ) ポインタを作り、それを領域の大きさ 使って範囲外の値を指した場合を考えてみましよう。ます ないことになっています。たとえば、 ring-increment を までは指してもかまいませんが、その後ろは指してはいけ 対する演算では、いちおう指している領域のすぐ次の要素 らみるとかならすしも正しいとはいえません。ポインタに ています。これで正常に動作しますが、 C 言語の規定か め、それか範囲外だと分かれは修正するという方法をとっ を使って補正します。このマクロでは、ます目的の値を求 域サイズを超えたり負の値になった場合には領域の大きさ 73
連載 /UNIX Communication Notes— 図 1 簡単な watchdog プログラム # ! /bin/sh mypager="xxxxx@docomo ・ ne ・ JP if [ ! -f /var/run/myserv. pid ] t hen restart—myserv 0 echO 'myserv does not run, then restarted' ー mai1 —s 'watchdog report ' $mypager exit 0 if [ -f /myserv. core ] then echO 'myserv dump the core ' f i pid= ( cat /var/run/myserv ・ pid ' result='ps —p $pid ー wc ー 1 ( if [ $result ! = 2 ] then restart—myserv ー mail 'watchdog report ) $mypager echO 'myserv restarted' ー mai1 f i exit 0 これらも、ある未では、、故嶂 " である。こういった故 —s ' watchdog report ' $mypager 障を減らすのは難しく、まして完全に防ぐのは不可能であ ろう。見方を変えれば、古章に強いシステムの実現にあた って、もっとも注意しなければならない要素といえる。 高性能サーバーを言 t する場合は、システムの故障は避 けられないことを絶対に忘れてはならない。 故障文のコスト サーバーがいつかはかならす嶂するのなら、そのシス テムで提供しているサービスも停止する可能性がある。し たがって、当然のことながら、サーバーにはなんらかの故 障対策が必要になる。 どの程度の対策を施すかは、そのサーバーの重要羅に よって異なる。むろん、重要であれはあるほど、コスト をかけて手厚い対策を講しることになる。たとえば、利用 者が多く、業務の中・じ的な処理を担うサーバーについては 十二分な対策が必要である。これに対し、万一占郞章しても 大多数の利用者の仕事にほとんど景与・えないサーバー なら、簡略な刈策でもかまわないだろう。 もっとも簡単な文 . watchdog もっとも簡単な嵂」策は、システムの挙動を監視する プログラムを起動しておき、異常を検知したらオペレータ 52 がシステムを再起動するガ去である。システムの挙動を監 視するこのようなプログラムを、一ヨ殳に watchdog ( 番犬 ) と呼ぶ。管理者が、このような機能をもつ小さなプログラ ムを自作することもよくある。 たとえは、デーモンとして動くサーバ myserv が、ソフトウェアの不具合からか、 ・プログラム ときどきコア ダンプして異常終了することがあるとしよう。このような 場合に、簡単な watchdog プログラムを作ってデーモン の挙動を監視するわけである。 図 1 は、ごく単純なプログラムである。デーモン my- serv が、起重加芋にフ。ロセス番号を /var/run/myserv. pid に言求しているとする。そして、トラブルがをした場合 には、コアファイルがルート・ディレクトリに作られると しよう。図 1 のプログラムは、プロセス myserv か動いて いるかどうかを調べ、止まってい川まスクリプト restart- myserv てサーバーを再起動する。同時に、その状況を変 数 mypager に指定したメールアドレス宛に送る。このフ ログラムを cron で定期的に動かし、 watchdog として機 能させてもよい。 以則は、ポケットベルへのメッセージの送信はけっこう難 しかったので、その機能をもつプログラムなどか販売されてい た。しかし、描丘はインターネットから携帯電話への送信か簡 UNIX MAGAZINE 2001.12
特集ネットワークの基礎知識② 図 9 telnet を利囲した sendmail の動作確認 % telnet 10Ca1 五 ost 25 Trying : : 1 ・ Connected tO 10ca1host . Escape character iS 220 normadic . ai3 . net ESMTP heIO portable. aist¯nara. ac 250 normadic . ai3. net He110 quit 221 2 . 0 . 0 normadic . ai3 . net Sendmai1 8.11.6 / 8.11.0 ; wed, 10 Oct 2001 07 : 00 : 43 + 0900 (JST) 10Ca1 五 ost [ : : 1 ] , pleased t0 meet you closing connection Connection closed by foreign host . ケーションでも暗号イし凾信がおこなえるようになる。国際 会義などでは、インターネットへのアクセスを提供するコ ーナーか設けられていることが多いが、このようなノワ・リ ックな場所では通信の安全は保証されていないと考えるべ きであろう。たとえは、悪意をもった誰かが、すべてのア クセスのログをとっている可能性もある。こういったとこ ろで通信の内容を保護する必要がある場合には、 SSH の ポート医機能を用いて VPN のように通信路を暗号化す 古典的なサービス ・ pmg 、 traceroute ・ BSDUNIX の r コマンド ・ FTP ・ Telnet なものがある。 ネットワークにおける古典的なサービスには、次のよう るのがもっともよい。 プロトコルを用いてリモートサイトの TCP ポート 23 番 ムへの遠隔ログインのために使われる。標準では、 Telnet ク・アプリケーションである。通常は、リモ telnet は、 UNIX 環竟でもっとも基本的なネットワー Telnet を使いこなすためのコツを紹介する。 以下では、これらの利用友去を簡単に説明し、それぞれ ートシステ 38 けではない。したがって、盗聴された場合には、パスワ ただし、 telnet コマンドでは通信路か暗号化されるわ ログインができる。 にアクセスする。これによって、リモートシステムに j 鬲 ードはもとより、遠 ; 鬲ログイン先のホストで実行した処理 の様子まて覗かれてしまうおそれがある。そのため、描丘 では telnet は組織内 LAN などの限られた範囲でしか使 われず、インターネット竟ではほとんど利用されていな い。事実、インターネットに直接接続されているシステム では、 telnet のサーバープロセスを起動させないはうか 通になっている。 それでは、 telnet にはどんな利用価値があるのだろう UNIX MAGAZINE 2001.12 を念入りにおこなうことカそきる。 ちでアクセスを繰り返せは、アプリケーションの重川御忍 mail の、、生の " 動きをチェックできる。このようなかた う。図 9 からも分かるように、ローカルホスト上の send ー ローカルホストの sendmail の動きをチェックしてみよ 従ってコマンドを送ればメールかま際に酉当される。 とくに間題なくコネクションか不寉立できたら、 SMTP に する MTA (Mail Transfer Agent) に直孑妾続される。 として接続する。これで、 mailserv 上の SMTP を処理 % telnet mailserv 25 が mailserv だとすると、 て市忍す川まよい。たとえは、メールサーバーのホスト名 る sendmail に直接コネクションを張り、 SMTP レベル かのガ去がある。 telnet を利用する場合は、サーバーであ うかを調べるには、テスト用のメールを出すなど、いくつ 例を挙げて説明しよう。 sendmail の設定が正しいかど 続できる。 ケーションのサー / ヾーであれば、 telnet コマンドで直孑妾 おこなわれているかを石忍できる。 TCP を用いたアプリ サーバーに直接アクセスすれは、プロトコル処理が正しく するときに重宝するのである。 telnet コマンドを実行して か。しつは、はかのアプリケーションの実装や重川乍を石忍
連載 / シェルの魔術ー① 図 3 逐次タ里 % Is ; sleep 10 ; finger ー wc ー 1 ; cat testl . txt test2. txt > 10g. txt ← ls の結果 li Ⅱ k . 1 link . 2 testl . txt test2. txt ← finger ー wc ー 1 の結果 ( 10 秒経過してから表示される ) ←標準出力への出力はないが、 cat も実行されている 3 図 4 逐次里とパックグラウンド・ジョブ % (ls; sleep 10 ; finger ー wc ー 1 ; cat testl. txt test2. txt > 10g. txt) & [ 1 ] 1600 % li Ⅱ k. 1 ←すぐにプロンプトが表示される 3 ( ls; sleep 10 ; finger ー wc ー 1 ; cat testl . txt test2. txt > 10g. txt ) link .2 testl . txt test2. txt [ 1 ] グラウンド・ジョブにするときには、全体を ( ) て括る " と憶え ておくとよいでしよう。 ちなみに、、、 & " 自体もコマンドの区切り文字として使 えます。その場合、、、 & " で区切られたそれぞれのコマン ドが、別々にバックグラウンド・ジョブとして実行され ます。 % setopt notify さて、画面に目を向けてみると・・ されていませんか ? 。おや、何か表示 [ 1 ] D one バックグラウンドで実行していた sleep コマンドか終 了したようです。、、 set notify" したため、終ってすぐに 表示されたのですね。 いろいろバッククラウンド・ジョブにしちゃえ パイプでひとかたまりになったジョブを、バックグラ ウンドで実行することもできます。この場合は、一 - 漣のコ マンドの最後に、、 & " を付けます ( 図 1 ) 。 もちろん、リダイレクションも使えます。この場合も、 最後に、、 & " を付けるだけです ( 図 2 ) 。 複数のコマンドを ; で区切ると、それらを逐梦朝勺に実 行することができます ( 図 3 ) 。あの処理をして、それが 終ってからこの処理をして・・ という場合に便利な使 い方です。この一 - 漣の逐次処理を、まとめてバックグラウ ンド・ジョブとして実行することもできます。それには、 行全体を、 ( ) " で括り、燧変に、、 & " を付けます ( 図 4 ) 。 ノート 3 しつは、 C シェルの場合は、 ; " よりも、 & " の解釈のほう が優先されるため、 ( ) て括らなくても同様の結果を得ることが できます。しかし、 Bourne Again シェルや Z シェルでは、 ・ " の解釈のはうが優先されるため、 ( ) がない場合には最後の コマンドだけがバックグラウンド・ジョブとして実行されるこ とになります。間違いを避けるためには、、逐次処理をバック sleep 120 -1 っ 4 1 0 0 イっ 4 な - ー」財ん testl . txt test2. txt 1i Ⅱ k . 2 [ 2 ] ls [ 1 ] sleep 1 こでは、 sleep コマンドと ls コマンドが別々にバッ クグラウンド・ジョブとして実行されていることか分かり ます。しかし私の経験では、バックグラウンド・ジョブ をこのように実行する人はあまりいないように思います。 停止中のジョブ ジョブには、 ( フォアグラウンドあるいはバックグラウ ンドで ) 実行中という状態のほかに、停止中という状態が あります。ジョブカ亭止中になるのは、ユーサーがジョブ に対して停止するように求めた場合と、なんらかの事情に よって勝手に停止してしまう場合です。 フォアクラウンド・ジョブの停止 たとえば、何かの作業中に別の作業をする必要が生し、 現在のフォアグラウンド・ジョブをいったん停止したくな ることがあります。このようなときには、 CtrI-Z を押す 89 UNIX MAGAZINE 2001.12
連載 UNIX Communication Notes グ " を用いた技術である。 ー 0 このガ去では、まったく同しディスク装置を 2 台用意 し、データをこれら 2 台に同時に書き込む ( 図 2-a)0 つ まり、 2 台のディスク装置は完全に同しデータをつねに保 持することになる。そして、どちらかか故障したら、もう 一方の正常なディスク装置を利用する。さらに、拠章した ディスク装置を交換した場合は、残った正常な 1 台から 新しいディスク装置へデータをコピーし、完全に同し内容 を保つように復元 (restore) する機能もある。 RAID 1 の システムは安価であり、とくに lntel 系 PC 用のデバイス が数多く市販されている。 その一例が、 Accusys の ACS ー 7500 RAID Kit とい う IDE RAID 製品である 2 。これは、 2 台の IDE ハー ドディスクによるハードウェア実装の RAID 1 システム である。システム側からは通常の 1 台の IDE ハードディ スクにみえるので、オペレーティング・システムに依存す ることもない。 1 台か章してもシステムを停止せずに交 換でき、交換後は自重加勺にデータのコピーを開始してくれ る。しかも、実売が 7 万円前後と、個人でも購入可能な価 格帯である。 安価なのは、システム側とディスク側のインターフェイ スが両方とも IDE のシステムだが、 SCSI や PCI など に対応した製品も数多く市販されている。 RAID 5 RAID 5 は、 RAID 1 よりも高機能なシステムである。 RAID には、アクセスを高速化する RAID 0 という 構成がある。これは、ディスクアクセスを高速化するス トライピング (striping) という手法を使う。ハードディ スクは、回転している磁気ディスク上にヘッドを移動さ せながらデータを読む。ディスクからデータを読み出す場 合、通常はヘッドを目的の場所に合わせるシークに時間が かかり、さらにデータの読出し自体にも時間がかかる。し たがって、連続するプロックを読み出すには、 シーク→読出し→シーク→読出し→ という処理を繰り返すことになる。そこで、連続するデー タに割り当てられるプロックを複数のディスク装置に振り 分けてオ褓内すると、シーク時間の部分を複数のディスクで 2 http://www.accusys-inc.com/ 54 重ね合わせることができ、結果としてデータの読出しか高 速化される。 UNIX MAGAZINE 2001.12 たとえは、落雷や電気工事などで一印判勺に電源信縣劼阯 ・ UPS の利用 般に次のようなバックアッフ手法を利用する。 は、ディスク装置に次いでトラブルが多い。このため、 システム管理における次の間題は電源である。電源装置 蚫源のバックアップ ある。 するディスク装置か 1 司しロットにならないように注意すべきで 能になる。したがって、 RAID 4 / 5 を利用する場合は、構成 に 2 台以 E のディスク装置か古郞章すると、データの彳こは不可 ク装置のみか郞章するという前提て構成されているため、同時 成しなければならない。また、 RAID 5 技術は 1 台のディス 当然ではあるが、 RAID 5 は同し頁のディスク装置で構 RAID 5 構成のハードディスクを利用している。 ができる。したがって、現在の高生能サーバーの多くは、 読出しか可能なだけでなく、障害にも強い構成にすること いようにしている。 RAID5 では、ディスクからの高速な ディスクか郞章しても、すべてのパリティ情幸肋ゞ失われな にパリテイデータを分散して↑内し ( 図 2 ー c ) 、パリティ RAID 5 では、 RAID を構成する複数のディスク装置 ディスクを明冓成すればよい。 リテイディスクか郊章した場合は、パリティを再引算して ループとて言 t 算をおこない、もとのデータを彳第己する。パ 障した場合には、パリテイデータと残されたプロックのグ 殊なパリテイデータを生成する。 1 台のディスク装置か故 置について、同一の物理プロック上のグループに対する特 ク装置を用意する。このディスクでは、複数のディスク装 アレイに加えて、、、パリテイディスク " と呼ばれるディス えられた ( 図 2-b)0 この構成では、 RAID 0 のディスク 出しか不可能になる。そこで、 RAID 4 という手法が考 0 を構成するディスクが 1 台でも嶂すると、データの読 ストライピングによって読出しは高速になるが、 RAID ロック・ストライピングかは毓である。 と呼ばれる 2 つの手法がある。現在のハードディスクでは、プ トライピングと、ヒ、ツトを単位としたビット・ストライピング ストライピングには、プロックを単位とするプロック・ス