いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.152 / 読者数:1322名

こんばんは、うすだです。

仕事のメールも、プライベートなメールも、 いったん同じメールボックスに突っ込んでいるわたくしにとって、 気になる調査結果を目にしましたので、ご紹介します。

「勤務中におけるプライベートメール」に関する実態調査
http://www.hde.co.jp/reports/20090127/

仕事中に、職場の PC でプライベートメールをしているひとが、 5割ほどいるそうですが、意外だったのは、 偉いひと(経営者、役員、部長など)に多く(約7〜8割)、 係長/主任に少ない(約4割)、ということでしょうか。

また、プライベートメールに用いられるツールで多いのが、Yahoo メールだそうです。 約5割、2人に1人が使っています。(複数回答可ですが)
Outlook 系も3割前後使われており、いずれも根強いなあと思いました。
かたや、Gmail が 15% 弱しかないことに、ちょっと驚きました。

有効回答者数が515名と、母体数がやや微妙ですが、 それを差し引いても十分参考になると思います。
PDF でも公開されていますので、気になる貴兄は、ご覧くださいませ。

わがふりを直そうかな…と思いつつ、今回も、はりきってまいりますよ。

今回のお題 - それを誰が使っているのか確認する

サーバ的なマシンを、みんなでよってかかって使っていますと (でだしはいつもこれですね…ワンパターンですみません)、 なにかを行う際には、だれかに迷惑がかからないようにする必要があると思います。

たとえば、CD-ROM をアンマウントしようと思ったら、誰かが使っていてできない、 といったときに、無理矢理アンマウントするのではなく、 誰かに確認をとって問題がなくなってから、アンマウントすべきですよね。

しかし、誰が使っているのか特定できないと、総当たりで探したり、 大声を張り上げて確認するといった行為が必要になってしまいます。

システム管理者たるもの、24時間たたかうためにも、 できるかぎり体力を温存しておきたいところですよね。
そんな貴兄のために、調べるためのコマンドがちゃんと存在します。
それは、fuser というコマンドです。
これを使いますと、 ファイルやディレクトリなどを使っているプロセスを調べることができます。

というわけで、今回は、fuser コマンドを用いて、 いろいろなものを使用しているプロセスを、探り当てたいと思います。
具体的には、以下について、調べてみようと思っております。

  1. マウントされたファイルシステムを使用中のプロセス
  2. ファイルを使用中のプロセス
  3. TCP または UDP のポートを使用中のプロセス

さて、まずは、ファイルシステムを使用中のプロセスを、 fuser コマンドで捜し当てたいと思います。

対象とするファイルシステムは、CD-ROM でも USBメモリでも、なんでも構いません。 以下のように、一時的に作ったファイルシステムのイメージを使うと、 問題が少なくてよいかもしれません。

  # dd if=/dev/zero of=/tmp/dummy.img bs=1M count=1
  # mkfs.ext2 -F /tmp/dummy.img
  # mount -o loop /tmp/dummy.img /mnt/tmp

上記の場合ですと、/tmp/dummy.img という 1MB のファイルを作成して、 ループバックデバイスとして /mnt/tmp に mount しています。
以降、マウントポイントが /mnt/tmp だという前提で、話を進めます。

2つ端末を用意して、一方の端末のカレントディレクトリを /mnt/tmp にしてください。

  $ cd /mnt/tmp
  $ tty
  /dev/pts/3

もう片方では、root の権限を得て、fuser コマンドを実行します。

  $ su -
  Password: 
  # fuser /mnt/tmp
  /mnt/tmp:             4236c

すると、プロセスID が 4236 のひとが使用中であることがわかります。
最後の c は、状態を表します。c の場合、 カレントディレクトリとして使用中であることを示しています。
プロセスID が 4236 とは誰なのか、ps コマンドで確認してみましょう。

  # ps -p 4236
    PID TTY          TIME CMD
   4236 pts/3    00:00:02 bash

ああ、大方の予想通り、 カレントディレクトリを /mnt/tmp に移動させたひとのようですね。
ちなみに、-v オプションをつけて fuser を実行しますと、 ps コマンドを実行せずとも、一発で判明します。

  # fuser -v /mnt/tmp

                       USER        PID ACCESS COMMAND
  /mnt/tmp             usu        4236 ..c..  bash

 

しかし、これでは、/mnt/tmp 直下にいるプロセスしか検出できません。
たとえば、/mnt/tmp に foo というディレクトリを作成して、

  # mkdir /mnt/tmp/foo

さきほどの端末のひとに、foo へと移動してもらいましょう。

  $ cd /mnt/tmp/foo

すると、先ほどと同じ方法では、検出できなくなります。

  # fuser /mnt/tmp
  /mnt/tmp:

そんなときは、-m オプションを使用します。
-m オプションをつけますと、 指定したディレクトリの所属するファイルシステムを対象としてくれます。

  # fuser -m /mnt/tmp
  /mnt/tmp:             4236c

では次に、ファイルに対して行ってみましょう。

一方の端末から、たとえば /etc/passwd を参照してみます。

  $ less /etc/passwd

そして、root になっている端末から、fuser を実行してみますと…

  # fuser /etc/passwd
  /etc/passwd:         6984
  # fuser -v /etc/passwd

                       USER        PID ACCESS COMMAND
  /etc/passwd          usu        6984 f....  less

上記のように、less コマンドを実行しているプロセスを検出することができます。


それでは、ネットワークに対してはどうなのでしょうか。
はい、ご親切にも、ソケットを使用しているプロセスも検出してくださいます。 それには、-n オプションを使用します。

  fuser -n {tcp もしくは udp} lcl_port[,rmt_host[,rmt_port]]

-n オプションの後に、まず tcp か udp を指定します。
その後に、ローカル側のポート番号 lcl_port を指定します。
もう少し絞りこみたい場合には、 相手側のホスト rmt_host とポート番号 rmt_port も , で区切って指定します。

たとえば、80/tcp を使用しているプロセスを検出したい場合は、 以下のように実行してください。(ちなみに、80 は http でも構いません。)

  # fuser -n tcp 80
  80/tcp:               3294  3307  3308  3351
  # fuser -vn tcp 80

                       USER        PID ACCESS COMMAND
  80/tcp               root       3294 f....  apache2
                       root       3307 f....  apache2
                       root       3308 f....  apache2
                       root       3351 f....  apache2

このように、apache2 が使用しているということがわかります。

また、たとえば、 192.168.1.1 のポート番号 35372 から telnet で接続しているひとを調べたければ、 以下のように実行します。

  # fuser -n tcp 23,192.168.1.1,35372
  23,192.168.1.1,35372/tcp: 15432

またまた、たとえば、DNS サーバのプロセスID は、以下の手順で検出ができます。

  # fuser -n udp 53
  53/udp:               2760

ちなみに、netstat コマンドでも、同様のことがわかります。

  # netstat -lnup | grep ":53 "
  udp    0    0 0.0.0.0:53        0.0.0.0:*           2760/unbound

以上の手順で、使用中のプロセスを見つけられるようになりました。

さて、見つかったとして、そのひとがいないなど諸般の事情により、 強制的にプロセスを終了させなければならない(or してよい)としましょう。
そんなときは、-k オプションをつけて fuser を実行してみてください。

  # fuser -mk /mnt/tmp
  /mnt/tmp:             4236c

出力結果は同じですが、プロセスID 4236 のプロセスに SIGKILLシグナルが送られ、 強制終了させられます。

  # fuser -m /mnt/tmp
  # 

…そして誰もいなくなった状態になりました。


以上、fuser コマンドを使って、 ファイルシステムやネットワークなどを使っているプロセスを調べる方法について、 ご説明しました。

ひとりで PC を使っていると、あまりニーズはないかもしれません。
しかし、そんなときでも、これは誰が使っているんだろう? と思うことはあると思いますので、いい機会だと思って、突き止めてみてください。

宿題の答え

前回の宿題は、

  設定ファイルやディレクトリなどを、alternatives で切り替えられる
  かどうか、試してみましょう。

でした。

では、前回の流れを受け継ぎ、/etc/gomen.conf という設定ファイルと、 /etc/gomen.d/ というディレクトリが切り替えられるのか、 実際に試してみたいと思います。
そして、やはり前回と同様、バージョン 0.1 と 0.2 があるとします。

まずは、切り替えられる対象を作成しましょう。
名前の最後に -バージョン を付加したファイルやディレクトリを、 以下の手順を参考に、作成してみてください。
(判別さえできれば、中身などは、どうなっていても構いません。)

  # echo "test 0.1" > /etc/gomen.conf-0.1
  # mkdir /etc/gomen.d-0.1
  # touch /etc/gomen.d-0.1/dummy-0.1
  # echo "test 0.2" > /etc/gomen.conf-0.2
  # mkdir /etc/gomen.d-0.2
  # touch /etc/gomen.d-0.2/dummy-0.2

作成したら、update-alternatives コマンドで、登録します。

  # update-alternatives /etc/gomen.conf gomenfile /etc/gomen.conf-0.1 \
  10 --slave /etc/gomen.d gomendir /etc/gomen.d-0.1
  # update-alternatives /etc/gomen.conf gomenfile /etc/gomen.conf-0.2 \
  20 --slave /etc/gomen.d gomendir /etc/gomen.d-0.2

バージョン 0.1 と 0.2 を、一気に登録してみました。
すると、 /etc/gomen.conf と /etc/gomen.d というシンボリックリンクが作成されました。 中身などを見てみますと、

  # cat /etc/gomen.conf
  test 0.2
  # ls /etc/gomen.d/
  dummy-0.2

前回と同様、優先度の高いバージョン 0.2 が選択されています。
もちろん、バージョン 0.1 を明示的に選択しますと、

  # update-alternatives --set gomenfile /etc/gomen.conf-0.1

おおかたの予想通り、バージョン 0.1 に切り替わります。

  # cat /etc/gomen.conf
  test 0.1
  # ls /etc/gomen.d/
  dummy-0.1

以上、設定ファイルやディレクトリなども切り替えられる、 ということがわかりました。
結論はいたって簡単でしたが、実際にやって確かめる、 ということが大事だと思います。面倒臭がらずに、是非やってみてください。

今回の宿題

今回の宿題は、

  指定したディレクトリ以下にいるプロセスをすべて見つけましょう。

です。

ファイルシステム単位ではないけれど、 指定したディレクトリ以下に誰もいないことを確かめたい、 というときには便利ではないかと思います。

あとがき

10年以上 UNIX 的な環境を使っていますと、ふだんよく使うコマンドや、 そのコマンドの使いかたが、だんだん固定されていくように思います。

ですので、他人の作業を眺めていると、そんな使いかたができるのか! という発見に出会うことがあります。

ご存じなかたはご存じだと思いますが、 コマンドラインの便利な使いかたを紹介してくれる(投稿できる)サイトがありましたので、ご紹介します。

Command-line-fu
http://www.commandlinefu.com/commands/browse

見てみますと、知らない使いかたが結構あることに気づかされます。
気になるものを実行してみては、 おおお…と静かな感動の唸り声を発するというスパイラルを、 ベタにやってしまいました。
(たとえば、sed -n '10,20p' file とか…知りませんでした。)

なにも考えずに、これに掲載されている方法を試すだけでも、腕が上がりそうですね。 ちなみに、百式さんで紹介されていて、知りました。

コマンドラインで使える超絶便利なワンライナーを投稿・共有できる『Command-line-fu』| 100SHIKI.COM
http://www.100shiki.com/archives/2009/02/commandlinefu.html

知合いや同僚が極端に少ないわたくしとしましては、ときどき閲覧して、 自らの視野の狭さを補完したいと思いました。

 

今回も、ここまで読んでいただき、ありがとうございました。
次回は、3月1日(日) 頃に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−斬新な栗の絵を描きたい! …と思う今日このごろです。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本