cat - みる会図書館


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

1. UNIX MAGAZINE 2001年10月号

連載 す。しかし、 シェルの魔術ー 0 コマンドの実行結果を既存のファイルに追 加したい場合もありますれこんなときのために、シェル には、、追加の出力リダイレクション " という機能がありま す。これは、次のかたちて硬います。 > " が 2 新規の出力リダイレクションの場合と異なり、 > > file file_ni_tsuika sude-ni-file—ga—aru—baai $ cat testl . txt $ echo file—ni—tsuika > > sude—ni—file—ga—aru—baai $ cat testl . txt みましよう。 つになっています。さっそく、」助日できるかどうか試して testl . txt たしかに追加されていますれ UNIX MAGAZINE 2001.10 ンは次のかたちてイ吏います。 閉してしまうことができます。閉しる出力リダイレクショ は、、、閉しる出力リダイレクション " を使って標準出力を 報は知らなくてもいいという場合です。このようなときに イルやインストールをしていて、その進捗状況に関する情 いこともあります。たとえは、アプリケーションのコンパ 場合によっては、コマンドの実行結果がまったく必要な 閉じる出力リダイレクション という動作をします。 2. 存在しない場合はファイルを新規に作成する 1. 存在する場合はそのファイルに追加し したファイルか有在するかどうかによって、 以のように、追加のリダイレクションは出力先に指定 カ噺しく生成さ実行結果が出力されました。 新規のリダイレクションのときと同しように、ファイル sonzal_senu_file_ni_tsuika $ cat test2. txt link . 1 link . 2 testl . txt test2. txt $ ls $ echO sonzai—senu—file—ni—tsuika > > test2. txt はどうなるのでしようか。 それでは、出力先に指定したファイルか存在しない場合 閉じるだけなので、ファイルを指定する必要はありませ ん。実際にやってみましよう。 $ ls testl . txt test2. txt li Ⅱ k .2 1i Ⅱ k . 1 $ echO tOj iru—redirection > & ー $ ls link . 1 $ ls li Ⅱ k . 1 link . 2 1 土Ⅱ k . 2 testl . txt test2. txt testl . txt test2. txt このように、何も表示されません。また、新しいファイ ルもできていません 漏れてる ? 出力リダイレクションをいろいろ試していると、たまに 不思議なことカ起こります。 たとえば、 testl. txt と test2. txt の内容をくつつけて log. txt に出力することを考えましよう。このためには、 次のようなコマンドを実行します。 $ cat testl . txt test2. txt > 10g. txt ところが、 cat の引数を間違ってしまうと・・ $ cat testl . txt test3. txt > 10g. txt cat : test3. txt : NO such fi1e 0 て directory $ cat 10g. txt sude—ni—file—ga—aru—baai file_ni—tsuika test2. txt を間違って test3. txt としたため、「そんなフ ァイルあらへんで」と怒られています・・・・・・が、おや ? ちゃ んと出力リダイレクションをしているにもかかわらず、 のエラーメッセージは端末に表示されています。 log. txt には testl. txt の内容がそのまま出力されていますれ 出力リダイレクションなしでこのコマンドを実行してみ ると、次のようになります。 $ cat testl . txt test3. txt sude—ni—file—ga—aru—baai file_ni—tsuika cat : test3. txt : NO such fi1e 0 て directory 111

2. UNIX MAGAZINE 2001年10月号

連載 / シェルの魔術ー 0 file_ni_tsuika $ cat く sude Ⅱ 1 ー testl . txt file—ga—aru-baai また、あまり使い途はありませんが、次のようにする [ れ幻く & れ 2 [ れ幻く & ー と、閉しるリダイレクションや複製もおこなえます。 入力、つまり 0 カ甘旨定されたことになります。 ともには省略することが可能です。省田芋は、標準 です。 入力に与えられるべき文字列を、茁旨定するためのもの ばれるものがあります。これは、実行するコマンドの標準 リダイレクションの 1 つに ヒア・ドキュメント ヒア・ドキュメントと呼 ます。デリミタはどのような文字列でもかまいません。実 ます。 d m はたんなる区切りで、デリミタと呼ばれ ている場合は、そのファイル・ディスクリプタ ) べ度され 売〃 m ・に囲まれた文字列は標準入力 ( れカ甘旨定され de m e ん e - doc - .. 下のように使います。 ヒア・ドキュメントの書式はすこし変わっていて、以 here—document no test > kugiri > here—document Ⅱ 0 test $ cat くく kugiri 際にやってみましよう。 UNIX MAGAZINE 2001.10 場合は、デリミタの前にもタブを入れてかまいません。 あるタブをすべて取り除く、という意味になります。この くく " の直彳変に ーを続けると、そオ・助、降の各行の頁に れています。 入力中は、そのことを示す、、 > " というプロンプトか表示さ ています。また、コマンドの標準入力べ度される文字列の この例では、デリミタに、、 kugiri" という文字列を使っ $ cat くく一 kugiri > ( タブ ) here—document no test > ( タブ ) kugiri here—document Ⅱ 0 test シェル・スクリプトのなかでヒア・ドキュメントを使 うときにこの機能を用いると、コマンドに渡す文字列をイ ンデントできるので、見やすくなってイリです。 ヒア・ドキュメントには、もう 1 つイ甦リな機能があり ます。 $ cat くく kugiri testl . txt Ⅱ 0 nakami > 'cat testl . txt' > kugiri testl . txt Ⅱ 0 nakami sude—ni—file—ga—aru—baai file_ni_tsuika はバッククオートと呼ばれます。コマンド行では、バ ッククオートて悃まれた部分をさきに実行し、その結果で 置き換える、という意味をもちます 6 。 ヒア・ドキュメントでは、コマンドに渡す文字列中の バッククオートを解釈し、そのコマンドの実行結果に置換 します。はかに、パラメータ置換 7 もおこなわれます。 一方、デリミタの地頁に、、 \ " カ咐いている場合、もしく はデリミタが、、 ' " または、、” " で囲まれている場合 8 は、コ マンド置換とパラメータ置換はおこなわれません。 testl . txt Ⅱ 0 nakami > kugiri cat testl . txt ( testl . txt Ⅱ 0 nakami cat くく 'kugiri' ンについて説明しました。次回は、複数のコマンドをつな 今回は、コマンドの入出力を切り替えるリダイレクショ ccat testl . txt' 6 これをコマンド新奐といいます。詳しくはあらためて説明します。 ( もりしま・なおと奈良先端科 ! 物支彳大判完大学 ) ぐ、、パイプ " を紹介する予定です。 これを、デリミタカ引用されているといいます。 7 これもいすれ・・・ 8 115

3. UNIX MAGAZINE 2001年10月号

連載 / シェルの魔術ー 0 図 3 標準出力と標準工ラー シェ丿レ 端末 標準 出力 端末 標準 工ラー 起動 変更 引継ぎ コマンド ファイル 標準 出力 端末 標準 実行結果は、エラーメッセージを含めて 3 行です。出 カリダイレクションをしたとき、この 3 行が log. txt に 出力されるはすなのに、実際には最後の行だけ端末に表示 されています。この行だけ、出力リダイレクションから漏 れてしまったのでしようか ? この謎の答は、次に説明する、、標準工ラー " にありま す。 標準工ラー 標準工ラーとリダイレクト ます。一方、処理中に発生したエラーを表すメッセージは 読み込み、それを標準出力 ( ここでは log. txt) に表示し cat(l) は、引数に指定されたファイルの内容を順番に ら、、端末 " を引き継ぎます ( 図 3 ) 。 おりです。それに対し、標準工ラー箱はそのままシェルか す。これは、出力リダイレクションのところで説明したと マンドの標準出力箱に "log. txt" というファイルを入れま シェルがコマンドを起動するとき、、、 > " を発見して、コ $ ロ cat : test3. txt : No such fi1e or directory $ cat testl . txt test3. txt > 10g. txt さて、前節の謎を解明しましよう。 端末になります。 ラーは端末なので、コマンドの、、標準ェラー箱 " の中身も 動したシェルから受け継がれます。通常、シェルの標準ェ す。標準出力の場合と同様に、標準ェラーもコマンドを起 これは標準工ラーと呼ば、、標準出力箱 " とは別の箱で ラーメッセージの出力先を指定するための箱もあります。 結果の出力先が入った箱を標準出力と呼びましたが、ェ 標準ェラーに出力されます。 112 こでは、 test3. txt という 存しないファイルカ甘旨定されたため、標準ェラー ( = 端 末 ) に、 cat : test3. txt : NO such fi1e or directory 頭に 2 をくつつけたかたちで使います。 レクションは、次のように標準出力のリダイレクションの か。大丈夫、もちろんできます。標售ェラーの出力リダイ メッセージをリダイレクトすることはできないのでしよう それでは、標準ェラー箱の中身を入れ替えて、エラー 標準工ラーの出力リタイレクション というエラーメッセージカ咄力された、というわけです。 ません。 このとき、 2 > file シェルは、標準ェラーの出力リダイレクションがコマン 2 と > のあいだに空白を入れてはいけ UNIX MAGAZINE 2001.10 を選ぶことができるのでしたれしかし実際には、この箱 てきました。そして、出力先として端末やファイルなど こまで、出力先を入れるための、、箱 " があると説明し 体、これは何を表しているのでしようか。 ところで、、、 2 > " の、、 2 " の正体、気になりませんか ? ファイル・ティスクリプタとリタイレクション 2 > > file に 2 を付けるだけです。 ンが使えます。いすれの場合も、標準出力との違いは、頭 ラーでも追加のリダイレクションや閉じるリダイレクショ もちろん、新規のリダイレクションだけでなく、標準工 果が、ファイルにエラーメッセージがそれぞれ出力されま さきはどの結果とは逆に、端末に cat コマンドの実行結 cat : test3. txt : NO such fi1e or directory $ cat err . txt file_ni_tsuika sude—ni—file—ga—aru—baai $ cat testl . txt test3. txt 2 > err . txt ラー箱に、、川 e " を入れて起動します。試してみましよう。 ド行にみつかると、オ剽售出力の場合と同しように、標準ェ

4. UNIX MAGAZINE 2001年10月号

連載 / シェルの魔術ー 0 別々の窓口 図 4 標準出力と標準工ラー にはプロセスが、、外の世界の何か " と通信するための、、志 ロ " が入っていると考えたはうがより正確てす。たとえば、 端末やファイル、ネットワーク上のほかのホストなどは、 プロセスからみると、、タ ) 世界の何か " です。したがって、 これらのものに対する入出力 ( 通信 ) は、すべてこの窓口 を通しておこなわれるのです。 2 の正体に話を戻しましよう。この数字は、、、箱 " を識 男けるための言当主子です。この言当子はファイル・ディス クリプタと呼はれます。そして、ファイル・ディスクリ プタのうち、 0 ~ 2 は以下のように予約されています。 0 標準入力 1 標準出力 つまり、この、、 2 " という数字は、、標準ェラー箱 " を表す ファイル・ディスクリプタなのです。、、 2 > e " は「標準 工ラー箱 ( 2 ) に川 e への窓口を入れる」といナ未だった のですね。 ー麹勺に、リダイレクションの書式は以下のようになり ます。 司几市ル叩 file れはファイル・ディスクリプタで、几市ル叩はリダイ レクションの不鶤頁を表す記号です。 file は出力先を表します。これは、閉しる出力リダイレ クションのように、市 7 、叩によっては不要なこともあ ります。 「ほな、標準出力箱は 1 番なんやから、標準出力のリダイ レクションは、、 1 > " になるんとちゃうの ? 」 上の一般形に従うと、標準出力のリダイレクションは 、 1 > " となります。実際に、このかたちて驃準出力をリダ イレクトすることもできます。、、 > " は、、 1 > " からファイ ル・ディスクリプタを省略した特別な書き方だったわけ です。、、 > > " や、、 > & ー " についても同様です。 2 1 0 端準カ 標出 端準カ 垣人 初期状叫 .- 別もの、、 ファイルファイル 端末 標準 標準 標準 入力 出力 工ラー > ルまで解釈。 file_ni_tsuika $ cat err . txt cat : test3. txt : NO such file or directory この例では、標準出力を log. txt へ標準ェラーを err. txt へと、別々のファイルにリダイレクトしています。 それでは、標準出力と標準工ラーを同しファイルにリ ダイレクトするにはどうすればいいのでしようか。すぐ思 いっくのは、出力先に同しファイル名を指定することです ね。 $ cat testl . txt test3. txt > 10g. txt 2 > 10g ・ txt $ cat 10g. txt cat : test3. txt : NO such file or directory おや、標準工ラーはファイルに出力されましたが、標 準出力のほうは消えてしまいました。これではだめなよう です。 さきほど、ファイルへの入出力は窓口を通しておこなわ れると説明しました。上記のリダイレクションでは、標準 出力への窓口と標準ェラーへの窓口が別々に生成さそ れぞれの箱に入れられます ( 図 4 ) 。ところが、この窓口は 出力先か 1 司ーのファイルになっています。このため、 1 っ のファイルに別々の窓口から出力されることになり、ファ イルの内容がおかしくなったのです。 同しファイルに正しく出力するためには、標準出力箱と 標準ェラー箱に入れる窓口を同しものにする必要がありま す。ちょうど、複数のファイル名が 1 つのファイルの実 標準出力と標準工ラー 標準出力のリダイレクションと標準工ラーのリダイレク ションは、同時に使うこともできます。 $ cat testl. txt test3. txt > 10g. txt 2 > err . txt $ cat 10g. txt sude—ni—file—ga—aru—baai 113 UNIX MAGAZINE 2001.10

5. UNIX MAGAZINE 2001年10月号

連載 / シェルの魔術ー 0 順番を逆にしてみると・・ 図 6 同じ窓口 図 5 標準出力と標準工ラー 0 1 2 2 1 0 ファイ丿レ 端末 端末 入力 出力 ・ - 複製 - 、 末 端準カ 標出 端準カ 垣人 末 端準カ 標出 端準カ 標入 期状態 期状叫 商示 2 > & 1 まで解釈 ー複製 - 、 末 端準カ 標出 端準カ 標入 まで解 * > & 1 まで解 $ cat testl . txt test3. txt 2 > & 1 > logerr. txt 体を指し示しているように ードリンクの仕組みを思い cat : test3. txt : NO such file or directory 出してください ) 、複数のファイル・ディスクリプタが 1 $ cat logerr. txt つの窓口を指し示すようにするわけです。これを、ファイ sude—ni-file—ga—aru—baai file_ni_tsuika ル・ティスクリプタの複製といいます。ファイル・ディ $ ロ スクリプタを複製するには、以下のようにします。 このように、標準出力だけカワァイルに出力さ標準 [ れ幻 > & れ 2 工ラーは端末に出力されてしまいました。この理由は図 6 を見れば分かるでしよう。標準出力をファイルに向ける前 とれ 2 はファイル・ディスクリプタで、れ 2 て示さ に標準工ラーへ複製してしまったため、標準工ラーは端末 れる箱の中身をに複製します 5 。また、は省略する に向いたままになったのです。 ことができます。省略した場合は、標準出力、つまり 1 が 指定されたことになります。 標準入力とリダイレクト それでは、やってみましよう。 標準入力 $ cat testl . txt test3. txt > logerr. txt 2 > & 1 $ cat logerr. txt コマンドのなかには、実行中になんらかの入力を求める sude—ni—file—ga—aru—baai ものがあります。このとき、入力を取り込む、もと " を標 file_ni_tsuika cat : test3. txt : NO such fi1e or directory 準入力と呼びます。ファイル・ディスクリプタの説明で こっそり出てきていますが、 0 番が、、標準入力箱 " を表す 今度は、ちゃんと標準出力と標準ェラーが 1 つのファイ 記子てす。 ルに出力されました。このときの様子を図 5 に示します。 標準入力のリダイレクション ます、標準出力をファイルに向けます。ここまでは図 4 の 標準入力をリダイレクションして、ファイルから読み取 場合と同しですね。次に、標準ェラーを標準出力カ甘旨し示 ることもできます。これは、次のかたちで使います。 している窓口に向けなおしています。 ところで、、、 > logerr. txt" と、、 2 > & 1 " には順番があ ります。順番を逆にして実行してみましよう。 5 実際には複製しているわけではなく、、共有している " という感しです。 イ ′、ラ ′イ ア準カ フ標出 端準カ 標入 末 ア準カ 標出 端末 > 第んまで解 標準 入力 く file もちろん、ファイル・ディスクリプタを明示的に指定 して、、 0 く " と書くこともできます。 114 UNIX MAGAZINE 2001.10

6. UNIX MAGAZINE 2001年10月号

連載 / シェルの魔術ー 0 出力リダイレクション 図 2 シェ丿レ 起動 端末 変更 標準 出力 図 1 標準出力の引継ぎ シェ丿レ 端末 標準 出力 ン末 マ端準カ 標出 コ コマンド ファイル 標準 出力 起動 引継ぎ 表示する、、出力先 " がなかに入った、、箱 " をもっています。 $ ls link . 1 link . 2 この箱のことを標準出力と呼びます。 $ cat testl . txt link . 1 $ ls li Ⅱ k . 2 ←実行結果 li Ⅱ k . 2 link . 1 testl . txt これは、お馴染みの ls コマンドを実行した様子です。 このように、出力リダイレクションを利用した場合、出 2 行目か夫行結果で、コマンドを実行したシェルと同し端 カ先として指定したファイルか存在しないときは自重加勺に 末 2 に表小されています。このように、シェルから起動さ 生成されます。また、 testl. txt の内容 ( つまり、 ls コマ れたコマンドの多くは、標準出力をシェルから引き継いで ンドの実行結果 ) に、 testl. txt 自体が含まれていること 使います。つまり、コマンドの、、標準出力箱 " のなかには、 に注目してください。これは、 ls コマンドが実行される 、、そのコマンドを起動した端末 " が入っているわけです ( 図 よりも前に testl. txt が生成されていることを示していま す。つまり、出力リダイレクションでは、出力先のファイ 新規の出力リダイレクション ルはコマンドか実行されるよりも前に作られるのです。 それでは、出力先に指定したファイルがすでにある場合 、、標準出力箱 " の中身は、任意のファイルなど 3 に入れ替 はどうなるのでしようか。 えることができます。この機能を出力リダイレクションと 呼びます。これは、次のかたちてイ吏います。 $ ls link . 1 li Ⅱ k . 2 testl . txt $ echO sude—ni—file—ga—aru—baai > testl . txt > file $ cat testl . txt コマンド行にリダイレクションがあると、シェルはコマ sude—ni—file—ga—aru—baai ンドの標準出力箱に、、川 e " を入れて起動します 4 。例を見 おっと、もとの内容か消え、今回の実行結果だけになっ てみましよう。 てしまいました。このように、出力リダイレクションでは、 $ 1s > testl . txt すでにあるファイルは上書きされてしまうので注意が必要 $ ロ です。この上書きのタイミングは、新規のファイルの場合 さきはどと違い、端末に ls コマンドの実行結果が出力 と同様にコマンドの実行前です。このため、 されす、そのまま終了してしまいました。これは、シェル $ cat testl . txt > testl . txt カ鰾準出力箱の中身を端末から testl. txt に入れ替えて、 ls コマンドを起動したからです ( 図 2 ) 。そのため、 testl. といった使い方はできません。 cat コマンドか夫行される txt という新しいファイルが生成され、そこにコマンドの 前に testl. txt が上書きされてしまうからです。 実行結果カ咄力されています。 追加の出力リダイレクション 2 xterm とか kterm とか、そういうものだと思ってください。 3 ほかの端末や周辺機器、ホストなどに切り替えることかできる場合もあり 上で述べたように、出力先としてすでにあるファイルを ます。 指定した場合、もとのファイルの内容は失われてしまいま 4 プロセスカ跿力される様子は、次可以降に詳しく説明します。 testl . txt 110 UNIX MAGAZINE 2001.10

7. UNIX MAGAZINE 2001年10月号

連載 / IJN Ⅸ便利帖ーの 図 1 fetch によるダウンロードの本好 % fetch http://www. cs. kyoto-wu. ac ・ jp/index. 址m1 fetch: index . htm1: sxze of remote fi1e is not known Receiving index. html: 14815 bytes 14815 bytes transferred in 0.0 seconds ( 10.40 MBps) % fetch http: //www. ieice ・ org/ftp/tex/ieicej/LaTex2e/J—2e-euc ・ tgz Receiving J—2e—euc. tgz ( 39173 bytes) : 100 % 39173 bytes transferred in 0 . 3 seconds ( 121.17 kBps) ル・スクリプトなどで fetch コマンドを実行するときに便 利です。 fetch コマンドの典型的な利用法は、 HTTP を使った tar ポールやパッケージなどのダウンロードでしよう。た とえは電子情幸凾信学会の論文誌用の I*TEX スタイル・ フォーマットをダウンロードするには、図 l-b のように します。 この例のように、取得したいファイルの大きさか事前に サーバーから通知されたときには、出力されるメッセージ が 1 行咸り、そのファイルをどの程度取得できたかが百 分率て表示されるようになります。この表示は、もちろん 転送中は郁変化します。 スクリプト中での利用 WWW 上をさまよっていて、著作者か無償で公開して いる画像集や音楽集などをみつけ、それらを全部ダウンロ ードしたいと思ったとします。そんなとき、それぞれの画 像や音楽をいちいち WWW プラウサで開いて、、ファイル へ保存 " などとするのはひどく面倒です。こういう場合は、 fetch コマンドをシェル・スクリプトと組み合わせて利用 すると小回りか利いて便利です。たとえば、ダウンロード したいファイルが http://www.f00.jp/images/に 100 個あり、それぞれに img001 ・ jpg—img100 ・ jpg のファイ ル名カ咐いているとします。 まず、これらのファイル名を生成することを考えます。 シェル・スクリプトでファイル名によるルーフ。処理をおこ なうには、 1 行に 1 っすっファイル名か書かれているよう な形式のものがあれは粳利です。このような出力を生成す るガ去はいくつかあると思います。 すぐ思いっくのは、リスト 1 のようなスクリプトを利 用するガ去でしよう。ここで利用している yes は、ふだ UNIX MAGAZINE 2001 ユ 0 リスト 1 ファイル名を生成するスクリプト ( 1 ) # ! /bin/sh yes ー head ー 100 ー cat ーⅡ八 awk '{printf "img%03d. jpg\n" , $ 1 } ' んあまり使わないかもしれませんが、 y だけからなる行 を延々と出力するコマンドで、たいへん古くから存在しま す。ここではそこから head コマンドでう巨頁の 100 行を 切り出して、 cat に引数ーⅡを与えることで 1 から始まる 行番号を振っています。そして最後に、 awk によって 1 行に 1 っすっファイル名を生成しています。 私はつい描丘気つ、いたのですが、 BSD 系の UNIX に は扣 t というイ叫リなコマンドがあります (/usr/bin/jot)o jot の基本的な使い方は、、、 jot 3 5 " というようなもので す。これにより、次のような出力カられます。 % jot 3 5 5 6 7 つまり jot コマンドは、第 2 引数で指定された値 ( 5 ) から始まる整数を、第 1 引数で指定された個数ぶんに では 3 個 ) 出力します。このコマンドを利用すれば、リス ト 1 の、、 yes ・・ ・・ cat ーⅡ " の部分を jot 100 1 " に置き換 えることができます。また、リスト 1 では最後に awk を 利用して書式付きの出力を得ていますが、 BSD 系 UNIX にはそのものすはりの pr ⅲ tf というコマンドがあり、 れを使えは置き換えることが可能です。これらを用いてリ スト 1 を改造したものがリスト 2 です。このようなかた ちでファイル名生成用スクリプトを書くこともできるので すれ 次に、肝腎の fetch コマンドを使って画像ファイルをダ ウンロードする部分を考えます。これはあまり悩ますに、 129

8. UNIX MAGAZINE 2001年10月号

連載 / IJN Ⅸ便利帖ーの リスト 2 ファイル名を生成するスクリプト # ! /bin/sh for i in 'jot 100 1 ( do printf ' img%03d. jpg\n' $i done ( 2 ) リスト 3 すべての画像をダウンロードするスクリプト # ! /bin/sh for image in yes ー head ー 100 ー cat -n ハ awk ' {printf " img%03d ・ jpg\n" , $ 1 } 戸 fetch —q http://www.f00 ・ jp/images/$image done さきほど生成したファイル名を使ってルーフ処理をおこな えばよさそうです。たとえは、リスト 3 のようなスクリフ トになると思います。このスクリプトを実行すれば、カレ ント・ディレクトリに次々と画像ファイルをダウンロー ドしてくれます。この例では fetch コマンドに引数ー q を 与えてメッセージを出力しないようにしています。 しかし、リスト 3 のようなスクリプトでは、ファイル のダウンロードを間断なく連続しておこなうので、アクセ スを受けるサーノヾーのことを考えるとあまりよくありませ ん。この程度のアクセスはたいていのサーバーでは間題に ならないかもしれませんが、それでもすこし遠慮するのが 紳士というものです。そこで、各ファイルのダウンロード のあいだに sleep コマンドで休憩を挟んだのがリスト 4 です。リスト 4 では sleep コマンドに引数 10 を与えて、 10 秒間隔で次のダウンロードを開始するようになってい ます。あまり厳密には考えていないので、最後のファイル を取得したあとも 10 秒待ってしまいますが、そのあたり は目をつぶってください。 ご存じのとおり、 WWW サーバーへのアクセスはすべ てサーバーで時刻とともに記録されます。リスト 4 のよ うなスクリプトでダウンロードすると、アクセス日該リが正 確に 10 秒おきになってしまいます。そのため、このア クセス言当求を人間 ( サーバーの管理者など ) が見たときに、 、、なんか自動でやりよったな " とバレてしまいます。これ を防ぐためにすこし姑息な細工をしたのがリスト 5 です。 リスト 5 では、 sleep コマンドの引数として jot -r 1 5 20 " の結果をえています。 jot コマンドに引数ー r を与 えると、第 3 引数で指定した数から第 4 引数て指定した 数までのあいだのランダムな整数を、第 2 引数で与えられ do 130 リスト 4 すこしま社的なスクリプト # ! /bin/sh for image in yes ー head ー 100 ー cat -n ハ awk '{printf "img%03d. jpg\n" , $ 1 } ' ' fetch —q ttp : / / w . f00 . jp/images/$image sleep 10 done リスト 5 姑息なスクリプト # ! /bin/sh fo て image in yes ー head ー 100 ー cat ーハ awk '{printf "img%03d. jpg\n", $ 1 } ' ( fetch —q http://www.f00 ・ jp/images/$image sleep j0t -r 1 5 20 ( done た個数だけ出力します。ですから、この場合は 5 から 20 までのあいだのランダムな整数が 1 個だけ出力されます。 たとえは次のようになります。 % j0t -r 1 5 20 9 12 wget fetch コマンドは引数として与えられた URL て表さ れるファイルを取得してくるだけですが、 wget コマンド は、それに加えてハイバーリンク先のファイルなどを再帰 的に取得できます。そのため、 wget コマンドを利用すれ は WWW サーバーのコンテンツを複製する ( ミラーサイ トを構築する ) ことが可能です。 wget は GNU プロジェクトで開発されたソフトウェア で、 http://sunsite.dk/wget/に詳しい説明があります。 また、他のコマンド凵招こ man コマンドによるオンラ イン・マニュアルもありますが、 http://www ・ gnu ・ org/ manual/wget/ には、 HTML 版や町版などいろいろ なフォーマットのマニュアルが置かれています。 do do この出力を sleep に渡すことによって、 5 秒から 20 秒 までのあいだのランダムな時間だけ休憩して、次のダウン ロードを開始するようにしています。こうしておけは、管 理者がアクセス言当求を見たときにも、このスクリプトから のアクセスは他のアクセスに紛れて目立たなくなるでしょ UNIX MAGAZINE 2001 ユ 0

9. UNIX MAGAZINE 2001年10月号

図 4 SCSI アダブタの糸 + 情報 # cat /proc/vmware/scsi/vmhba0/stats vmhbaO : not shared PCI info for vmhba0: 0 : 1 : 0 VMware Direct—Access ANS 工 SCSI revision: Typ e : Mode1 : DMVS18D Rev: 0100 Vendor : IBM # cat /proc/vmware/scsi/vmhbaO/O : 0 図 5 SCSI ディスクの糸 + 情報 Num B10cks : 35843670 BIock size: 512 Partition 工Ⅱ fo : Queue Depth : 35 17501 Mbytes 03 Commands Reads Kbytes read Writes Kbytes written Commands aborted Bus resets 187 178 684 4 2 0 0 num : 1 : 2 : S t art 63 Size 112392 112455 35728560 Type f c fb VMkernel に割り当てられている SCSI アタフ。タや、 そのアダブタに接続されている SCSI ディスクの数や種 類を調べるには、 /proc/vmware/scsi ディレクトリを参 照します。 このディレクトリには、次のように SCSI アダブタご vmhbaO/ vmhbal/ # ls /proc/vmware/scsi タブタは 2 つあります。 とのサプディレクトリがあります。この例では、 SCSI ア 184 のディスクの・最ネ刀のノヾーティション」 「 vmhba0 のアタフ。タに接続されている、 SCSI ID が 1 という形式になります。たとえは、 vmhba0:1:0:0 は、 アタブタ名 : SCSIID : LUN: パーティション番号 スクのファイル名は、 という形式になっています。 ESX サーバーの SCSI ディ SCSI ID : LUN ファイル名は、 集してあります ) 。 ファイル内容のサンプルを図 5 に示します ( 空白部分は編 とパーティションごとの糸兤日青報を得ることができます。 、数 : 数 " のファイルを読み込むと、ディスクの不頁 糸兤 l"l 青幸艚き込まれています ( 図 4 ) 。 があることが分かります。 stats には、 SCSI アタフ。タの この例では、 SCSI ID が 0 、 1 、 2 の SCSI ディスク 0 : 0 1 : 0 2 : 0 stats # ls /proc/vmware/scsi/vmhba()/ SCSI ディスクに対して 1 つのファイルが存在します。 そして、そのサプディレクトリのなかには、 1 つの Partition 0 : Commands Reads Kbytes read Writes Kbytes written Commands aborted Bus resets Partition 1 : C ommands Reads Kbytes read Writes Kbytes written Commands aborted Bus resets Partition 2 : Commands Reads Kbytes read Writes Kbytes written Commands aborted Bus resets 51 30 18 0 0 0 0 80 1 1 0 0 0 0 0 80 164430 89149 724152 75081 0 0 1241683 という意味です ( 普通の SCSI ハードディスクの LUN は 0 になります ) 。 通常の Linux では、アタフ。タとは関係なく、カーネル に認識された順に sda 、 sdb 、 ・・のような言里的な名前 カ咐けられます。これに対し、 ESX サーバーでは物工軸勺 に指定しなけ川まならないことに注意してください。 コンソール OS に VMFS をマウントする ESX サーバー上で df コマンドを実行すると、図 6 の ようなパーティションがマウントされているはすです。万 この図のように表示されなかった場合は、次のコマン 次に、 ls コマンドで /vmfs/vmhba ・・・・のディレクト # /usr/sbin/mount—vmfs ドを root 権限で実行してください。 UNIX MAGAZINE 2001.10

10. UNIX MAGAZINE 2001年10月号

VMware 図 11 リソース割当ての言 ロ閲 t> ・出ょ 2 ( 31 の CPU Sh ′ 05 : 0 1 Only u ・ P を 0 ( を 3 or( ー ) : 「 W X 8 5 ロ〕 total fO ′・ running 曾 0 日 d を・ ( onfig リ′・ d ・ 1 ロ圓 RAM S ト引 M み x ー m リ作 256 MB Network En みトに・ ( 3 トみ p 9 奩 0 協・ b にみ ( 5 ト・ p ⅲ 9 Kbps Peak : Kbps 8 リを : 560 ( on 名 9 リ d ・ total fo 物れんれ 9 wo 日 d を・ 状態であっても、 CPUI に割り当てられることはありま マルチ CPU の場合 せん。 ESX サーノヾーに複数の CPU がある場合、 VMkernel はイ課 PC を適切にスケジューリングして CPU を割り メモリ 当てます。しかし、あるイ反想 PC に 1 つの CPU を占有 イ反 PC のメモリの合言値か物理メモリよりも多くな させたい場合など、保想 PC を実行する CPU を制御し ると、 VMkernel はメモリのフレックス・アロケーショ たいこともあります。 ンを始めます。このとき、 CPU shares と同様に、、メモ CPU の割当ては、設定ファイルに以下の書式で言当し リの割当て優先度 " を決めるための設定値があり、これも ます ( 、、 CPU リスト " にはカンマ ( , ) で区切った CPU shares と呼びます。設定可能なイ直の範囲も、 1 ~ 100 , 000 番号を列挙します ) 。 と同しです。デフォルト値は、佖想 PC のメモリ容量を MB て表した数値の 10 倍になります。 sched. cpu. affinity = "CPU リスト " 【例】 sched. cpu. affinity 仮想 PC の設定ファイルには、以下の書式で言己しま す。 Web インターフェイスで仮想 PC を実行する CPU を設定するには、図 11 の、 Only Use Processor(s)" の sched. mem. shares = " 値ー 【例】 sched. mem. shares チェックポックスを設定するだけです。 " 2560 " コマンドラインの場合は、、、 CPU リスト " を root の Web インターフェイスで設定する場合には、図 11 の 権限で以下のファイルに書き込みます。 RAM の欄にある、、 Shares" を変更します。一方、コマン ドラインで設定を変更するときは、 root の権限で以下の /proc/vmware/vm/ID 番号 /cpu/affinity ファイルに設定値を書き込みます。 操イ料列を以下に示します。 /proc/vmware/vm/ID 番号 /mem/shares # cat /proc/vmware/vm/316/cpu/affinity ネットワーク 0 , 1 # echo 0 > /proc/vmware/vm/316/cpu/affinity ESX サーバーはネットワークの帯域制御をサポートし cat /proc/vmware/vm/316/cpu/affinity 0 ており、 1 台の仮想 PC が帯域を使いきってしまわないよ この例では、 ID 番号 316 の一課 PC はつねに CPUO うに設定できます。この機能は、ホスティング・サーピス を提供する場合には必顔だと思います。 で実行されるようになります。たとえ CPUI がアイドル 192 UNIX MAGAZINE 2001.10