b.l0g.jp     About     Archive     Feed

shのwhileループでファイルを読み、中でsshを実行すると1回しかループしない

シェル(sh)スクリプトネタ。

while 文で以下のように指定すると、行ごとにファイルを読み込むことができる。

  
#!/bin/sh

\# ファイルを1行ずつ読み込んで表示

TESTFILE=./hoge.txt

while read line
  
do
      
echo $line
  
done < $TESTFILE
  

しかし、 while ループの中で ssh や rsh を実行すると、読み込むファイルが複数行あっても、1行目しか処理されない。

  
#!/bin/sh

\# TESTFILEが複数行あっても1行目のみ処理されてループ終了

while read line
  
do
      
ssh 192.168.0.1 touch $line
  
done < $TESTFILE
  

SSH を実行すると、標準入力がそちらに振り向けられるため、read で読んだ1行のみならず、ファイル全体が SSH に渡されてしまう。従って、SSH を実行した後はもう読める行がないので while ループは1回で終了してしまう。

これを防ぐには、ssh に -n オプションを付け、/dev/null をリダイレクトし、標準入力をリダイレクトしないようにする。

  
#!/bin/sh

\# TESTFILEが複数行あればその行数分処理が実行される

while read line
  
do
      
ssh -n 192.168.0.1 touch $line
  
done < $TESTFILE
  

なおこれは rsh コマンドでも同じ仕様になっているようだ。

なぜ1行目だけで終わってしまうのか分からずうんうんうなってたら、この本に書いてあった。

ディレクトリをディレクトリにマウント

Linuxで、ディスクデバイスではなく、ディレクトリをディレクトリにマウントしたい時は

  
mount -bind マウントしたいディレクトリ マウントポイント
  

fstabに書いてしまうときは以下のように書く。

  
マウントしたいディレクトリ マウントポイント none bind 0 0
  

例えば /home を /hoge/home としてマウントしたい時は

  
/home /hoge/home none bind 0 0
  

なお、マウントしたいディレクトリ(上の例では/hoge)よりも後にこの行を書かないと、マウントできないので注意。

sarコマンドでシステムのボトルネックを探る(2)

CPUの処理の状況を調べるためには、sar (sar -u)が有効であることを前のエントリで書いた。次はメモリの使用状況を調べてみる。まず見てみるのは、メモリとスワップの使用状況を示す sar -r の結果である。

  
[doublemarket@hoge ~]$ sar -r
  
Linux 2.6.18-194.8.1.el5 (hoge) 2011年02月15日

00時00分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
  
00時10分01秒 12964 497568 97.46 30880 107440 1984336 63940 3.12 16392
  
00時20分01秒 13064 497468 97.44 30972 107376 1984336 63940 3.12 16392
  
00時30分01秒 12692 497840 97.51 31092 107236 1984336 63940 3.12 16392
  
:
  
:
  
20時20分01秒 43756 466776 91.43 45624 139552 1984336 63940 3.12 16288
  
20時30分01秒 27008 483524 94.71 46420 147608 1984336 63940 3.12 16288
  
20時40分01秒 22664 487868 95.56 46840 148920 1984336 63940 3.12 16288
  
20時50分01秒 22300 488232 95.63 47192 148968 1984336 63940 3.12 16288
  
平均値: 84267 426265 83.49 32592 129944 1984336 63940 3.12 16300
  

それぞれの列の意味は以下の通り。

kbmemfree
物理メモリの未使用KB。
kbmemused
物理メモリの使用済みKB。
%memused
物理メモリの使用率。Linuxでは、使用されていないメモリ領域をファイルシステムキャッシュ領域として使用するので、通常はほとんどfree部分はないものと考えてよい。従って、常に90数%といった高い使用率になる。実際にアプリケーションの動作に使われているメモリの量は、下の指標を確認する必要がある。
kbbuffers
カーネルがバッファ領域として使用しているメモリ量のKB。
kbcached
カーネルがキャッシュとして使用しているメモリ量のKB。kbmemusedからkbbufferesとkbcachedを引いた値が、実際にアプリケーションに割り当てられているメモリ量ということになる。逆に言えば、kbbufferesとkbcachedの容量が、kbmemusedの大部分を占めているようなら、アプリケーションにとってメモリ不足とは言えないということになる。
kbswpfree
スワップ領域の未使用量KB。
kbswpused
スワップ領域の使用済みKB。
%swpused
スワップ領域の使用量。通常ほとんど0だが、物理メモリが不足してくると使用率が上がってくる。数%であれば実質的にシステムの動作には影響がない場合が多いが、あまり多いようだと、スワップ領域へのアクセスが頻発している可能性もあり、システム全体のスループットを落とすことがある。%swpusedが大きく、かつsar -uのiowaitの値も大きい場合、ほぼ間違いなくスワップ領域へのアクセスでスローダウンしているので、物理メモリの増設などのメモリ不足解消策を取る必要がある。
kbswpcad
何の指標かよく分からなかったが、manページによると、一旦スワップ領域へ飛ばされたものの(スワップアウト)、スワップ領域からメモリに戻され(スワップイン)、かつまだスワップ領域にデータが残っている、というデータの量とのこと。

各列の値の傾向を見ると、上記のようにメモリ不足なのかどうかの手がかりが得られる。その他に詳しい情報を見たいときは、以下のオプションも用意されている。

sar -R
メモリ上のページの使用状況。
sar -W
スワップの発生状況。ページイン(スワップ領域から物理メモリへのページの移動)とページアウト(物理メモリからスワップ領域へのページの移動)がどの程度発生したのかを確認できる。
sar -B
ページングの状況。ページイン・ページアウトされたデータ容量、ページフォルトの回数、メジャーなページフォルトの回数をそれぞれ確認できる。