psコマンド(Linux)

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2004/2004-04-12 /ps-command.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

■psコマンド(Linux)

Linux の ps コマンドは、BSD 系 Unix のものに似ているが、 System V 系 Unix (Unix 98標準)のオプションも受け付ける。 BSD 系のものは、オプションの前に(-)を付けない。

ps

Linuxの ps(process) コマンドは、引数を付けないで実行すると、 プロセス識別子、端末名、 CPU時間、コマンド名を表示する。
----------------------------------------------------------------------
% ps [←]
  PID TTY          TIME CMD
23788 pts/0    00:00:00 tcsh
23819 pts/0    00:00:00 emacs
23822 pts/0    00:00:00 cat
23958 pts/0    00:00:00 ps
% []
----------------------------------------------------------------------
ただし、そのままでは、psコマンドを実行した端末と結びつけられているプロ セスしか表示しない。

◆ps x

「-x」オプションを使うと、他の端末に結び付いているプロセスも表示する。
----------------------------------------------------------------------
% ps x [←]
  PID TTY      STAT   TIME COMMAND
23788 pts/0    S      0:00 -tcsh
23819 pts/0    T      0:00 emacs -nw
23822 pts/0    T      0:00 cat
23967 pts/1    S      0:00 -tcsh
23996 pts/1    S      0:00 /bin/sh /usr/local/netscape/run-mozilla.sh /usr/local
24000 pts/1    S      0:03 /usr/local/netscape/mozilla-bin
24002 pts/1    S      0:00 /usr/local/netscape/mozilla-bin
24003 pts/1    S      0:00 /usr/local/netscape/mozilla-bin
24004 pts/1    S      0:00 /usr/local/netscape/mozilla-bin
24013 pts/0    R      0:00 ps x
% []
----------------------------------------------------------------------

◆ps -l, ps l (long)

プロセスが使っているメモリの大きさ (SZVSZRSS)、親プロセスの PID (PPIID(Parent PID))優先順位(PRI(priority)) などの プロセスの資源と属性を表示する。
----------------------------------------------------------------------
% ps -l [←]
  F S   UID   PID  PPID  C PRI  NI ADDR    SZ WCHAN  TTY          TIME CMD
100 S  1013 23788 23786  0  71   0    -  1025 rt_sig pts/0    00:00:00 tcsh
000 T  1013 23819 23788  0  69   0    -  2210 do_sig pts/0    00:00:00 emacs
000 T  1013 23822 23788  0  69   0    -   585 do_sig pts/0    00:00:00 cat
000 R  1013 24029 23788  0  74   0    -   817 -      pts/0    00:00:00 ps
% ps l [←]
  F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
100  1013 23788 23786  13   0  4100 2152 rt_sig S    pts/0      0:00 -tcsh
000  1013 23819 23788   9   0  8840 4540 do_sig T    pts/0      0:00 emacs -nw
000  1013 23822 23788   9   0  2340  552 do_sig T    pts/0      0:00 cat
000  1013 24030 23788  12   0  3268 1304 -      R    pts/0      0:00 ps l
% []
----------------------------------------------------------------------
Linux の ps は、ps -l と ps l で動きが若干異なる。-l は、System V 風、 l は、BSD 風である。

◆ps u

ps l, ps -l と同様に詳しい表示をする。
----------------------------------------------------------------------
% ps u [←]
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
yas      23788  0.0  0.8  4100 2152 pts/0    S    21:21   0:00 -tcsh
yas      23819  0.0  1.7  8840 4540 pts/0    T    21:21   0:00 emacs -nw
yas      23822  0.0  0.2  2340  552 pts/0    T    21:21   0:00 cat
yas      24047  0.0  0.3  2840  904 pts/0    R    22:04   0:00 ps u
% []
----------------------------------------------------------------------

◆ps -e (every)

全てのプロセスを表示する。System V 風。

◆ps a (all)

端末と結び付いている全てのプロセスを表示する。 x も付けた方がよい。

◆ps ax (all)

全てのプロセスを表示する。BSD風。

◆ps aux

a,u, x の組合わせ。全てのプ ロセスを表示する時に、よく使われる。

プロセスを殺そう

プロセスには、ls のように、勝手に終了するプログラムもあるが、エディタ emacs や X ウインドウ関連のプログラムのように、終了のための操作をして 始めて終了するプログラムもある。 場合によっては、プロセスが自主的に終了する前に、 強制的に終了させなければならないことがある。 これを、プロセスを 殺す(kill) という。

プロセスを殺す方法には、次のような方法がある。

どちらの方法でも、裏ではシグナル(ソフトウェア割込み) という仕掛けが働く。

◆キーによるプロセスの強制終了

次は、cat のプロセスを^Cで強制終了している。
----------------------------------------------------------------------
% cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^C
% []
----------------------------------------------------------------------
^Dを打つと、キーボードから EOF (End Of File) が送られ、cat プ ログラム自ら自発的に終了する(キーボードには、普通のファイルと違い、終 わりとう考え方はないが、OS がそういう仕組みを提供している)。 ^Cを打つと、cat は、自発的に終了するのではなくて、強制終了さ せれている。

^Cと同様に ^\ もあるが、 デバッグ用にcore という名前のファイルができることが異なる。 coreは、実行中のプロセスのメモリの内容をファイルに保存したものである。

注意:以下の実験を行う場合、core を作る実験をする時には、 gnome-terminal ではなく、kterm を実行するとよい。標準の端末 (gnome-terminal) では、^\ では、漢字変換機能の on/off に割り当 てられている。

% kterm & [←]
% []
kterm の中で次の実験を行う。
----------------------------------------------------------------------
% limit coredumpsize unlimited [←]
% ls -l core [←]
ls: core: そのようなファイルやディレクトリはありません
% cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^\
Quit (core dumped)
% ls -l core [←]
-rw-------    1 yas      lab         61440 Apr 27 23:30 core
% []
----------------------------------------------------------------------
core を作る実験をする時には、limit コマンドでcoredumpsize を unlimited にする必要がある。標準では、0 kbytes になっている。
% limit coredumpsize [←]
coredumpsize    0 kbytes
% limit coredumpsize unlimited [←]
% limit coredumpsize [←]
coredumpsize    unlimited
% []
coreファイルはプログラムのデバッグに使える。

----------------------------------------------------------------------
% gdb /bin/cat core [←]
GNU gdb Red Hat Linux (5.1-0.71)
Copyright 2001 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(no debugging symbols found)...
Core was generated by `cat'.
Program terminated with signal 3, Quit.
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x4010cf74 in __libc_read () from /lib/i686/libc.so.6
(gdb) where[←]
#0  0x4010cf74 in __libc_read () from /lib/i686/libc.so.6
#1  0x40162e34 in __DTOR_END__ () from /lib/i686/libc.so.6
#2  0x08048e9c in __fxstat64 ()
#3  0x08049902 in __fxstat64 ()
#4  0x40048657 in __libc_start_main (main=0x8049330 <__fxstat64+1756>, argc=1, 
    ubp_av=0xbffff494, init=0x80489ac, fini=0x804a93c <__fxstat64+7400>, 
    rtld_fini=0x4000dcd4 <_dl_fini>, stack_end=0xbffff48c)
    at ../sysdeps/generic/libc-start.c:129
(gdb) 
----------------------------------------------------------------------
どのような関数(この例では番地だけ)が呼び出された結果、プログラムが終了 したかがわかる。

普通のデバッグ(自分が作ったプログラム)では、いちいち core を作る必要は ない。単にデバッガの中からプログラムを実行すればよい。強制的に core を 作るのは、普通、既に実行している他人が作ったプログラムを解析する時など に限られる。

◆kill コマンドによるプロセスの強制終了

^C^\ で死なないプロセス を殺すには、kill コマンドを使う。
% kill pid [←]
プロセス識別子pidのプロセスを殺す。 オプションなしでkill コマンドを使っても死なないプロセスがある。 その場合はオプション -KILLをつけてkillコマンドを 実行する。
% kill -KILL pid [←]
これでほとんどのプロセスは死ぬ。(OSの都合上(ディスクのI/O完了の 報告など)で、死なないプロセスもある。)

◆kill システムコールによるプロセスの強制終了

kill コマンドは、内部では、kill システムコールを使っている。kill シス テムコールは、「ソフトウェア割込み」に分類される仕組みを提供する。ソフ トウェア割込みは、ハードウェアの割込みをソフトウェアによりエミュレート したようなものである。詳しくは、後半の講義で述べる。
Last updated: 2004/04/11 22:00:24
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>