fuser デ撃滅


セントス. ナヲ, 天気晴朗ナレドモ波高シ.

「このファイル, (ディレクトリ, ソケット, ポート ... その他リソース), 誰が使っとんじゃ?」 という問題に苛なまれたことはありませんか? これを一発で解決してくれるのが fuser というコマンドです. ただ, このコマンド, どの unix システムにもあるのかどうか, あるいはどのディストリビューションにもあるのかどうか, 私は知らないので, どこでも通用するワザかどうか, 判りません.

Linux ならだいたいいけそうな感じですが.

(2000/12/26 追記) solaris 7.6 版の純正 fuser は, 検索する名前空間としてネットワークソケット等を指定することは できない様子. もっとも netstat で調べられるのだが. しかし, この, netstat, tar, sendmail あたりの マニュアルの読みにくさって, 一体何じゃろね? じっさい, こうなるともう何語で書いてあるかなんて全然どうでも良くて, synopsis を見る気になるかどうかですな. むしろコマンド書式を知っているかどうか, でしょうか. とかいって, 知ってりゃマニュアル見ねえよ.

だいたい, ファイルシステム越しにアクセスできるリソースは, これでチェックできるようになっています. たとえば, /tmp 以下にある, 謎のソケット群.

   yuji@aya:/tmp/.ICE-unix%ll
   total 0
   srwxrwxrwx   1 yuji     users           0 Dec 19 09:51 13224=
  

これですが, 「一体何に使われているのか?」 と思った人は居ませんか? え?そんなファイルあることも知らんかったって? ははは. じつは私も, 最近 gnome-users[jp] メーリングリストで これ関連の記事が流れてて初めて知ったのです.

こんなときは, このコマンド.

   yuji@aya:/tmp/.ICE-unix%fuser -v 13224 

                        USER        PID ACCESS COMMAND
   13224                yuji      13224 f....  gnome-session
  

つまり, 自分の gnome-session がこれを使っているのでした. おー. プロセス間通信の出入口がここにあったわけですな. なーるほど.

gnome のアプリケーションどうしは ORBit で通信しますが, そのソケットは, アプリケーションを起動すると /tmp/orbit-某 以下に作成されます. 「fuser ファイル名」でソケットをアプリケーションが使っている様子をみてみよう.

マニュアルをみると, 通常のファイルだけでなく, ネットワークソケットもみることができるようだ. しかし, ちょっとマニュアルをみただけでは, これがコマンドの書式がよくわからんのだよ.

まず, fuser はわりかし思い切ったプログラムなので, これで情報を取り出すことができるプロセスは限られていることに 注意しよう.

具体的に言うと, 普通のユーザの場合は, 自分がオーナーのプロセスに関する情報だけを みることができる. だから, たとえば well-known なポートを見ているメジャーなサーバに 関する情報は, 普通のユーザ権限では, 大抵の場合, 見れないことになる.

   root@aya:/home/yuji#fuser -v -n tcp 25,

                        USER        PID ACCESS COMMAND
   25,/tcp              root        243 f....  tcpserver
   
   root@aya:/home/yuji#fuser -v -n tcp 80,

                        USER        PID ACCESS COMMAND
   80,/tcp              root        236 f....  httpd
                        root      13642 f....  httpd
                        root      13643 f....  httpd
  

上記コマンドは, root 権限で実行されていることに注意じゃ.

さて, コマンド書式の意味じゃが, -v はありがちに verbose すなわち饒舌(要らぬ親切ともいう)オプション. -n のあとの tcp は, 検索する名前空間は, 普通のファイルではなく tcp のソケットですよ. ということ. このあと tcp のソケットを指定するわけだ. tcp のソケットというのは, tcp のコネクション. コネクション指向 とかなんとかいう, あのコネクションですな. この構成部品がソケットなのです. 自分の http と smtp とか, 自分の http と隣の http が混線しないのは, OS が「コネクション」ごとに通信を管理しているからです. あ, 自分の http が隣の http と混線しないのは IP レイヤのおかげでした. すんません.

で, このコネクションってのは何かというと, 「ソケット」の組みなんですな. そしてさっきからしきりに出て来るソケット. ソケットというのは IP アドレスと ポートの組みです.

やっとソケットまでたどり着きました. つまり, IP アドレス a.b.c.d の x 番ポートから e.f.g.h の y 番ポートに繋いだ場合, ソケット「a.b.c.d, x」と ソケット「e.f.g.h, y」の組みが「コネクション」です. IP アドレスは概ね(笑)世界に一個ですから, OS が適切にポート番号を 割り当てれば, それらの組みがインターネット上の通信を一意的に識別できる わけです.

上記 fuser で "80," とコンマのあとが省略されているのは, コンマのあとに ホスト(つうか, IP アドレス)が入るわけです. 省略したら, ローカルホスト. つまり, 自分のマシン. こうして, 自分のマシンの 80番のポートを使っているのは httpd であることが判明(要するに, apache だ). ローカルホストのソケットを 80, で指定するわけです. コネクションで指定することもでき, 80,localhost,1234,remote みたいに書くこともできます.

しかし, こいつには実は省略記法があり,(だったらそっちを先に書けよ) じつはこれでもいい.

root@aya:/home/yuji#fuser -v smtp/tcp 

                        USER        PID ACCESS COMMAND
   smtp/tcp             root        243 f....  tcpserver
  

この場合は, ポート/検索する名前空間 という書き方で, -n 名前空間 ソケット とは引数の順序が逆ってことに注意. 25番を見てるのは, sendmail じゃなくて, inetd でもなくて, 私のホストの場合は DJB の tcpserver です.

ファイルにアクセスしてるプロセスを捜すときに 検索する名前空間を指定するオプションが必要無かったのは, デフォルトの名前空間が ファイル名だからです.

先の, ファイルにアクセスしている奴等を調べるのに話を戻そう. /home を umount して fsck する, なんてことをタマにやっとくと 起動したとき「/dev/hda3 was not checked too long, checking forced」 とかいって, 急いでるときに限って e2fsck になるというまーひーの法則に 引っかかるのを未然に防止できます. が, そのとき, たまに「device or resouce busy」とかいって umount できないことがあります. しかし, いちいちファイルを調べるわけにも いかないわけで. だって, /home 以下なんて膨大なファイルがあるじゃ ないですか. そんなときは

root@aya:/home/yuji#fuser -vm /home 

                        USER        PID ACCESS COMMAND
   /home                yuji      13203 f.c..  .xsession
                        yuji      13223 f.c..  xconsole
                        以下256行略

オプション -m はファイルシステムごとに検索します. いっぱいありますな.

これ, 全部いちいち kill -9 してられっかよ!という短気な御方には, fuser -km /home で殲滅. でも, これで, プロセスがどういう順番で死ぬのか私は知りませんから, イキナリこれをやるんじゃなくて, (init ほげ とかで) できるだけ普通に kill してからが良いような. つまり, 配送中のメールとかあるとまずいからね.

古人曰ク. 勝ツテ兜ノ緒ヲ締メヨ. 笑.


記事リストへ