プロセスの基本
プロセスとは
OSから見たときに,実行中の一つの一つのプログラムをプロセスという。
個々のプロセスにはIDが割り当てられ,それをPIDと呼ぶ。
動いているプロセスを調べる
psコマンド
ps [options]
実行中のプロセスを一覧表示する。オプションによって,表示するプロセスの条件を指定したり,表示形式を切り替える。
実行例
[toshim@gw2000 ~]$ ps
PID 端末 状態 時間 コマンド
672 p0 S 0:00 -bash
689 p0 R 0:00 ps
[toshim@gw2000 ~]$ ps ax
PID 端末 状態 時間 コマンド
1 ? S 0:03 init [3]
2 ? SW 0:00 (kflushd)
3 ? SW< 0:00 (kswapd)
4 ? SW 0:00 (md_thread)
5 ? SW 0:00 (md_thread)
36 ? S 0:00 /sbin/kerneld
166 ? S 0:00 /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done
237 ? S 0:00 syslogd
(以下省略)
[toshim@gw2000 ~]$ ps l
フラグ UID PID PPID PRI NI サイズ 常駐 WCHAN 状態 端末 時間 コマンド
100 500 672 671 18 0 1268 836 wait4 S p0 0:00 -bash
100000 500 946 672 19 0 1536 600 R p0 0:00 ps l
[toshim@gw2000 ~]$ ps axf
PID 端末 状態 時間 コマンド
1 ? S 0:03 init [3]
(途中省略)
434 1 S 0:00 -bash
969 1 S 0:00 \_ sh /usr/X11R6/bin/startx
970 1 S 0:00 \_ xinit /usr/X11R6/lib/X11/xinit/xinitrc --
971 ? S 0:02 \_ /usr/X11R6/bin/Xwrapper :0
972 1 S 0:00 \_ /usr/X11R6/bin/wmaker
977 1 S 0:00 \_ /usr/X11R6/bin/kinput2
990 1 S 0:00 \_ wmclock -shape
991 1 S 0:00 \_ xppxpm -wmaker -shape -geometry -0-0
(途中省略)
|
表示項目の意味
| フラグ |
プロセスのフラグ。 |
| UID |
プロセス所有者のユーザID。 |
| PID |
プロセスID。 |
| PPID |
親プロセスのプロセスID.。 |
| PRI |
task構造体のカウンタフィールド。 |
| NI |
プロセスの優先度を表すniceの値。
-20が最高の優先度,19が最低の優先度。 |
| サイズ |
プログラム部分とデータ部分とスタックを合計した仮想イメージの大きさ。 |
| 常駐 |
メモリ中に常駐している部分の大きさ。 |
| WCHAN |
プロセスが休眠状態の時のカーネル関数名。 |
| 状態 |
プロセスの状態。
R 実行中(running)
S 休眠中(sleeping)
D 割り込み不可能な休眠中
T 停止中かトレース中
Z ゾンビプロセス
W 常駐ページがない
N プロセスのnice値(NI)が正の値(優先度が低い) |
| 端末 |
プロセスを起動した端末 |
| 時間 |
プロセス起動後経過したCPU時間 |
| コマンド |
プロセスを起動するときに実行したコマンド。 |
psコマンドの主なオプション
| l |
長い形式で詳細を表示。 |
| u |
ユーザ名,CPU占有率,メモリ占有率,開始時刻などを表示 |
| j |
PGID(プログラムグループID)などを表示 |
| s |
シグナル形式 |
| v |
vm形式 |
| m |
メモリ状態の表示(pオプションと一緒に使うとメモリサイズをページ数で表示する) |
| f |
コマンドライン部分をプロセスの親子関係に基づいてツリー状に表示 |
| a |
自分以外のユーザのプロセスについても表示 |
| x |
制御端末のないプロセスの情報も表示 |
| S |
子プロセスのcpu時間とページフォールトを合計して表示 |
| c |
task構造体中の実行ファイル名だけを表示 |
| e |
コマンドラインの後ろに環境変数などを表示 |
| w |
表示内容が長い場合に,w一つあたり1行分表示行を増やす。つまり,wが一つだと2行に,wが二つだと3行に渡って表示される。 |
| h |
ヘッダを表示しない |
| r |
実行中のプロセスだけ表示 |
| n |
USERとWCHANを数字で表示 |
topコマンド
top [-] [d delay] [q] [c] [S] [s] [i]
プロセサの時々刻々の状態変化を一定時間ごとに継続的に画面に表示する。
CPUやメモリ使用率の高いものから順に表示できる。
実行例
[toshim@gw2000 ~]$ top
12時53分(午後) 稼働 1時28分, 3 ユーザ, 負荷平均率: 0.00, 0.00, 0.00
プロセス: 合計 67, 待機中 61, 実行中 1, ゾンビ 0, 停止中 5
CPU状態 : ユーザ 1.9%, システム 1.9%, nice 3.8%, 待機96.2%
メモリ : 合計127708K, 45928K使用, 81780K空き, 41000K共有, 1860Kバッファ
スワップ: 合計130748K, 0K使用, 130748K空き 18864Kキャッシュ
PID ユーザ PRI NI サイズ 常駐 共有 状態 LIB %CPU %MEM 時間 コマンド
2744 toshim 19 19 828 828 648 R N 0 3.8 0.6 0:00 top
1 root 0 0 404 404 340 S 0 0.0 0.3 0:03 init
2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd
3 root -12 -12 0 0 0 SW< 0 0.0 0.0 0:00 kswapd
4 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 md_thread
5 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 md_thread
442 news 0 0 284 284 228 S 0 0.0 0.2 0:00 crosspost
445 news 0 0 760 760 596 S 0 0.0 0.5 0:01 innwatch
331 root 0 0 356 356 304 S 0 0.0 0.2 0:00 gpm
36 root 0 0 364 364 308 S 0 0.0 0.2 0:00 kerneld
226 bin 0 0 336 336 268 S 0 0.0 0.2 0:00 portmap
166 root 0 0 420 420 348 S 0 0.0 0.3 0:00 dhcpcd
|
pstreeコマンド
pstree [-a] [-c] [-h] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
プロセスを親子関係に従ってツリー上に表示する。
実行例
[toshim@gw2000 ~]$ pstree
init-+-actived
|-atd
|-bash---startx---xinit-+-X
| `-wmaker-+-kinput2
| |-wmclock
| `-xppxpm
|-cannaserver
|-crond
|-dhcpcd
|-gpm
|-httpd---10*[httpd]
|-inetd---in.telnetd---bash---bash---bash-+-man---man.exe---sh-+-gunzip
| | `-less
| `-pstree
(以下省略)
|
プロセスとシグナル
シグナルとは
Unix系のOSは,実行中のプロセスに外部から割り込んである情報を通知できる。
その情報通知をシグナルという。
通常,プロセスを再起動したり強制終了するときに,プロセスに対してシグナルを送る。
シグナルを送るときはkillコマンドを使う。
プロセスの所有者とスーパユーザがシグナルを送れることができる。
具体的になシグナルの詳細はこちらを参照。
プロセスの強制終了
kill -KILL <プロセスID>
プロセスにSIGKILLシグナルを送ると,プロセスは強制終了する。
killコマンドでシグナルを送る場合,シグナル名の先頭のSIGを省略してもよい。
killコマンドはシグナルを省略すると,SIGTERMシグナルを送る。
実行例
[toshim@gw2000 ~/work]$ ps
PID 端末 状態 時間 コマンド
3125 p0 S N 0:00 -bash
3879 p0 T N 0:00 cat
3880 p0 R N 0:00 ps
[toshim@gw2000 ~/work]$ kill -KILL 3879 ← SIGKILLシグナルをプロセス3879に送る
[1]+ Killed cat ← SIGKILLシグナルを受け取ってcatコマンドが強制終了
[toshim@gw2000 ~/work]$ ps
PID 端末 状態 時間 コマンド
3125 p0 S N 0:00 -bash
3881 p0 R N 0:00 ps
|
プロセスの再起動
Webサーバなどのバックグラウンドで動作するデーモンプロセスの設定を変更した場合など,プロセスを再起動したいときがある。
その場合にSIGHUPというシグナルを送ると再起動するものが多い。
実行例
+----- プロセスの開始時間
[root@gw2000 ~]# ps axu|grep httpd ↓
nobody 4381 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4382 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4383 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4384 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4385 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4386 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4387 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4388 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4389 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
nobody 4390 0.0 0.9 2016 1252 ? S 13:54 0:00 httpd
root 342 0.0 0.9 2004 1240 ? S 11:25 0:00 httpd ← これがhttpdの親プロセス
[root@gw2000 ~]# kill -HUP 342
[root@gw2000 ~]# ps axu|grep httpd
nobody 4644 0.5 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4645 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4646 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4647 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4648 0.5 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4649 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4650 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4651 0.5 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4652 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
nobody 4653 0.0 0.9 2016 1252 ? S 14:01 0:00 httpd ← 再起動したので子プロセスの開始時間が新しくなっている
root 342 0.0 0.9 2004 1240 ? S 11:25 0:00 httpd
|
プロセスの優先度変更
reniceコマンド
renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]
実行中のプロセスの優先度を変更する。
スーパユーザ(root)はpriority(nice値,優先度を表す)を任意の値に変更できるが,一般ユーザはnice値を上げ,優先度を下げることしかできない。
実行例
[toshim@gw2000 ~]$ ps l
フラグ UID PID PPID PRI NI サイズ 常駐 WCHAN 状態 端末 時間 コマンド
100 500 3125 3124 18 0 1272 840 wait4 S p0 0:00 -bash
100000 500 3137 3125 19 0 1536 600 R p0 0:00 ps l
[toshim@gw2000 ~]$ renice +1 -p 3125 ← プロセスID3125のnice値を+1に設定する
3125: old priority 0, new priority 1
[toshim@gw2000 ~]$ ps l
フラグ UID PID PPID PRI NI サイズ 常駐 WCHAN 状態 端末 時間 コマンド
100 500 3125 3124 10 1 1272 840 wait4 S N p0 0:00 -bash ← nice値(NI)が1になっている
100000 500 3139 3125 11 1 1536 600 R N p0 0:00 ps l
[toshim@gw2000 ~]$ renice +2 -u toshim ← ユーザtoshimが所有するプロセスのnice値を+2に設定する
500: old priority 1, new priority 2
[toshim@gw2000 ~]$ ps l
フラグ UID PID PPID PRI NI サイズ 常駐 WCHAN 状態 端末 時間 コマンド
100 500 3125 3124 18 2 1272 840 wait4 S N p0 0:00 -bash ← nice値(NI)が2になっている
100000 500 3369 3125 20 2 1536 600 R N p0 0:00 ps l
|
|