A Day In The Boy's Life -152ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Linux上では、実行処理されているプログラムがプロセスという形で扱われ、それを見ることで正常に処理が進んでいるかを確認することができます。
Linuxでプロセスを調べる代表的なコマンドとしてpsコマンドがありますが、そのほかの方法でもプロセスを知ることができます。


サーバー管理者からみると、プロセスは名前で判別したほうがもちろんわかりやすいのですが、システム上から見た場合、同名のプロセスもあったりするためかえって判別がつきにくくなります。
プロセスは個別に受け持つ役割があるため、別のプロセスを間違って操作してしまうと、親子関係にあるプロセスなどへ影響が及んでしまいます。
そのため、プロセスにはユニークなプロセスIDが割り振られています。


プロセスをプログラムから操作する場合は、このプロセスIDを用いて操作するのが一般的です。
そのプロセスIDを取得する方法をいくつか紹介します。



もっともポピュラーなpsコマンド


プロセスの状態を調べるための最もよく知られているのはpsコマンドだと思います。


# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2064   632 ?        Ss   Feb09   0:02 init [3]
root         2  0.0  0.0      0     0 ?        S    Feb09   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Feb09   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    Feb09   0:00 [watchdog/0]
root         5  0.0  0.0      0     0 ?        S    Feb09   0:00 [migration/1]
root         6  0.0  0.0      0     0 ?        SN   Feb09   0:00 [ksoftirqd/1]
root         7  0.0  0.0      0     0 ?        S    Feb09   0:00 [watchdog/1]

そのサーバー上で動いている全てのプロセスが一覧表示され、状態やどれくらいの負荷がある(CPUやメモリ利用率)かを表示してくれます。
オプションも多彩にありますので、見たい情報に併せて変えてみたり、特定のプロセスに絞ってみたい場合は、grepと組み合わせてみると良いでしょう。


# ps -ef | grep httpd
root      6910  6822  0 16:24 pts/1    00:00:00 grep httpd
apache   10270 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10271 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10272 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10273 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10274 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10277 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10279 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
apache   10281 17700  0 Feb15 ?        00:00:00 /usr/sbin/httpd
root     17700     1  0 Feb10 ?        00:00:00 /usr/sbin/httpd

左から2番目がプロセスIDとなり、3番目が親のプロセスIDとなります。
上記の場合は、17700がApacheの親プロセスとなり、それに8つの子プロセスが起動しているのがわかります。



psコマンドをグラフィカルにしたpstreeコマンド


psコマンドはフラットにプロセスを表示するため、多少見づらいところがあります。
pstreeコマンドは、プロセスをツリー上に見やすく表示してくれます。


# pstree -cpn
init(1)┬ migration/0(2)
       ├ ksoftirqd/0(3)
       ├ watchdog/0(4)
       ├ migration/1(5)
(略)
        └ httpd(17700) ┬ httpd(10270)
                      ├ httpd(10271)
                      ├ httpd(10272)
                      ├ httpd(10273)
                      ├ httpd(10274)
                      ├ httpd(10277)
                      ├ httpd(10279)
                      └ httpd(10281)

上記のように、httpdプロセスの親プロセスと子プロセスの関係がわかりやすく表示されます。
また、「-p」オプションを付けることでプロセスIDを表示することもできます。



特定のコマンド名からプロセスIDを表示するpidofコマンド


こちらは純粋にプロセスIDだけを表示してくれるコマンドです。


# pidof /usr/sbin/httpd
17700 10281 10279 10277 10274 10273 10272 10271 10270

上記のようにhttpdコマンドを実行しているプロセスIDを全て表示します。
単なるIDの羅列なため、サーバーを管理する上ではあまり使い道がないのですが、プロセスを操作するプログラムを書いたりする場合は、余計な情報が含まれないため有効だったりします。


パッケージで導入した場合に付属する自動起動スクリプト(/etc/rc.d/init.d/)では、停止時にpidofコマンドを使ってプロセスIDを取得し、TERMシグナルをkillコマンドで送って停止させています。(※1)

例えば、Apacheの自動起動スクリプトを覗いてみると


stop() {
    echo -n $"Stopping $prog: "
    killproc -d 10 $httpd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

停止命令(stopオプション)をつけた場合に呼び出される関数ですが、その中でkillprocという関数がさらに呼び出されています。
killproc関数は、このApacheの自動起動スクリプトで読み込まれているfunctionsというファイルの中で定義されています。
さらにkillprocというコマンドを覗いてみると、その中で__pids_pidofという関数が呼び出されており(※1)、その中身は


# Output PIDs of matching processes, found using pidof
__pids_pidof() {
    pidof -c -o $$ -o $PPID -o %PPID -x "$1" || \
        pidof -c -o $$ -o $PPID -o %PPID -x "${1##*/}"
}

のようにpidofコマンドが呼び出されてプロセスIDを取得しています。


※1 実際にはPIDファイルを優先的に探し、存在する場合はその中に書かれているプロセスIDを利用します。
※2 Linuxのディストリビューションやパッケージのバージョンによって内容が異なってきます。



条件付きでプロセスIDだけを取り出せるpgrepコマンド


出力結果は、pidofコマンドに似ているのですが、取り出す際に条件もつけられるpgrepコマンドというのもあります。

実行方法は、pidofと同様にコマンド名を指定します。


# pgrep -f /usr/sbin/httpd
10270
10271
10272
10273
10274
10277
10279
10281
17700

で、さらにこのApacheのプロセスの中からrootで実行しているプロセス(親プロセス)を取り出してみます。


# pgrep -f /usr/sbin/httpd -u root
17700

逆に、root以外(Apacheのユーザーであるapacheユーザー)で実行されているプロセスを指定してみると


# pgrep -f /usr/sbin/httpd -u apache
10270
10271
10272
10273
10274
10277
10279
10281

親プロセス以外のプロセスIDが表示されましたね。
場合によっては、pidofコマンドよりこちらの方がプロセスIDを取得しやすいかもしれません。



プロセスIDを記したPIDファイル


起動するコマンドの種類によっては、プロセス起動時にプロセスIDをファイルに保存する動きをするものがあります。


# ls /var/run/
NetworkManager  auditd.pid  console  dbus  klogd.pid  netreport  pcscd.pid
(略)

中を見てみると、単純に親プロセスのIDだけが記載されています。


# cat /var/run/httpd.pid
17700 

先ほどのApacheの停止スクリプトでも、最初にこのプロセスIDファイルが存在するかをチェックし、存在する場合はその中に記載されているプロセスIDを停止させるような動きをしています。



/proc プロセス情報を含んだ特殊なファイルシステム


/procディレクトリ以下にもプロセスに関する情報が保存されています。


# ls /proc/
1  10277  165  1982  2043  2235  2454  2598  2668  367  6788  9  cmdline  fb
(略) 

番号が書かれたディレクトリがずらずらと表示されます。
この番号はプロセスIDを示していて、これらの中にはそのプロセスIDが処理するのに必要な、さまざまな情報が格納されています。


# ls -o /proc/17700
合計 0
dr-xr-xr-x 2 root 0  2月 17 11:21 attr
-r-------- 1 root 0  2月 18 16:32 auxv
-r--r--r-- 1 root 0  2月 16 10:24 cmdline
-r--r--r-- 1 root 0  2月 18 16:32 cpuset
lrwxrwxrwx 1 root 0  2月 18 16:32 cwd -> /
-r-------- 1 root 0  2月 18 16:32 environ
lrwxrwxrwx 1 root 0  2月 10 11:24 exe -> /usr/sbin/httpd
dr-x------ 2 root 0  2月 17 11:21 fd
-rw-r--r-- 1 root 0  2月 18 16:32 loginuid
-r--r--r-- 1 root 0  2月 18 16:32 maps
-rw------- 1 root 0  2月 18 16:32 mem
-r--r--r-- 1 root 0  2月 18 16:32 mounts
-r-------- 1 root 0  2月 18 16:32 mountstats
-rw-r--r-- 1 root 0  2月 18 16:32 oom_adj
-r--r--r-- 1 root 0  2月 18 16:32 oom_score
lrwxrwxrwx 1 root 0  2月 18 16:32 root -> /
-r--r--r-- 1 root 0  2月 18 16:32 schedstat
-r-------- 1 root 0  2月 18 16:32 smaps
-r--r--r-- 1 root 0  2月 16 10:34 stat
-r--r--r-- 1 root 0  2月 18 16:32 statm
-r--r--r-- 1 root 0  2月 16 10:24 status
dr-xr-xr-x 3 root 0  2月 17 11:21 task
-r--r--r-- 1 root 0  2月 18 16:32 wchan

先ほどのPIDファイルは消すことはできますが、こちらは特殊なファイルとなっており消すことはできません。
ですので、確実に起動しているプロセスIDの一覧となります。
PIDファイルは一種のロックファイル(プロセスを2重起動しないように)のような扱いなので、/procディレクトリ以下にそのプロセスIDがあるかを厳密にチェックしたほうが、プロセスの稼動を確実に確認することができます。


- 更新情報

2009.02.18 pgrepコマンドに関する情報を追加しました。





まだ1月なのに、各社携帯の春モデルを発表したりしてますね。

そろそろ今もっている携帯のローンが終わるので、買い換えることができる時期になります。

そういう風に、最近の携帯電話は端末の金額を月賦で払わせるような仕組みになっているため、それなりの期間(短ければ1年、長ければ2年とか。長ければ月々の金額が安くなるけど、途中解約すると残りの分をいっきに払わせられる上に、ペナルティが上乗せされることもあったり)を持ってないといけなくなります。


私の場合、新しい携帯に飛びついたりするようなことはあまりないのですが、分割で払っている期間は月々の支払額が若干高くなるため、その期間というのがどうしても気になったりもします。

まぁ、要りもしないなんだかんだの機能を付けて端末が高くなるぐらいなら、自分にとって必要最小限のものだけに絞らせてもらって、その分を安くしてよと思ったりもします。


例えば・・・


- ワンセグ

いらない。最初は興味引かれて、今の携帯も機能がついているけど、ほとんど立ち上げない。

(そもそもあまりTV見ない人でした・・・)


- カメラ

どちらかというといらない。高解像度なら欲しいかもしれないけど、そうなると結構分厚くなって嫌だ。


- アプリ(ゲーム)

欲しい。暇つぶしにはなるから。


- アプリ(電子マネー)

必要。特にモバイルスイカは定期で活用中。余計なカードを持たなくてよくなるので便利。


- ネット(ウェブ通信)

必要。地図見たり時刻表調べたり程度なんで代替もできるんだろうけど、いざというときに常に手元にある携帯で見ることが多い。


- メール

必要。これも代替できるけど、ショートメッセージ送るときは携帯からが手っ取り早い。


- メディアプレイヤー

いらない。音楽は他のデジタルオーディオプレイヤーで聴きます。


あとは、余計なソフトも多いですよね・・・。

カメラで撮った画像を編集したりだとか。まぁ、まず使いませんけど。


最近ネットブックがやけに欲しくなったため、携帯電話を買い換える魅力が薄れつつあります。

私の携帯の使い方は、通話よりメールやウェブが中心なので、だったら通信費が高くつく上に自由度が低い携帯を持つよりは、ネットブックのようなPCと変わらない機能をもったものを持つほうがメリットがあるかなぁと。

今の携帯は2年弱使っていますが、ローンが終わったんであればそれからがコスト的にもお徳にはなる時期なので、使い続けたほうがよいのかなぁとも。


さっきも書きましたが、やっぱり端末自体の金額が高すぎるんですよね。

よくよく考えたら、ネットブックより高い。

あれだけコンパクトに機能をぎゅっと押し込めているのでコストが高くつくのはしょうがないのかもしれませんけど、全てのユーザーが望んでいる(または使いこなせる)機能をそろえているわけではありません。


今は無理かもしれませんけど、そのうちオーダーメイドの携帯とか作ってくれるようになりませんかねぇ。




ほんのすこし書き方に注意すれば、あなたのドキュメントはさらに分かりやすくなる! @ Enterprisezine


こういった具体論ではなく、もっと意識的なことなんですが、つられて書きたくなったので。


私が文章を書くときに気をつけているのは、ただ1つです。


如何に相手の時間を削れるか


これだけ。

そこを意識すれば、相手に伝える文章は短いほうが良いとか、要約しましょうとか、箇条書きが有効とかがわかってきます。


相手に理解してもらうって言うのはものすごく労力の要ることです。

伝える側も、受け取る側も。

じゃあ、その時間配分はどのような割合にすればいいかということになります。


- パターン1

自分が文章を書く時間: 3分

相手が文章を読んで理解する時間: 27分


- パターン2

自分が文章を書く時間: 27分

相手が文章を読んで理解する時間: 3分


どちらが良いかということです。

もちろん自分から見れば、パターン1の方が良いに決まっていますね。

重要な意思決定をしてもらうにしても、手間は少ないほうが良いに決まっています。

ですが、相手からみればどうかと考えればおのずと自分が書くべき文章というのがわかってきます。

(単純に時間をかければ良いってもんじゃないですが)


また、相手が一人であれば27分で済みますが、10名いた場合にはそれぞれの27分を浪費させることになってしまいます。

であれば、自分が27分の時間を消化することでみんなにわかりやすい文章に仕上げたほうが、ものすごくコストメリットが生まれます。


たまに、何でこんなに理解するのに時間がかかる文章を書くんだろうって思うことがあります。

この人は、自分に理解するための時間を使わせたいんだな、自分のことを暇で時間がある人って思ってるのかな、とひねくれた感情がわきあがってきたりもします。


ただ、こういうことって褒められることでもないんですよね。

わかりやすい文章で、相手の頭にすっと溶け込む文章がかけたとしても、相手はわかりやすい文章だなぁと言ってはくれません。

しかし、そういう文章に慣れた人って別の読みにくい文章との違いがはっきりわかるようになってきます。


誰だって時間を無駄にされるのは嫌がります。

それは文章を書くときも一緒のこと。

それにかかる自分の時間というものを優先させるからおかしな文章になって、相手の時間を浪費することになり、不快な気持ちになったりするのではと。


そういう相手にすっと溶け込む文章を書くことを意識して、相手の時間を削ることに貢献する手間というのを惜しんではいけないなと感じます。