この章では、システムプロセスを管理する手順について説明します。この章で説明する手順は次のとおりです。
この節では、プロセス情報を管理するために使用されるコマンドについて説明します。
ps コマンドを使用すると、システム上でアクティブなプロセスの状態をチェックできます。また、プロセスについての技術的な情報も表示できます。このデータは、プロセスの優先順位をどのように設定するか判断するなどの管理作業に利用できます。
ps コマンドを使用すると、システム上でアクティブなプロセスの状態をチェックできます。使用するオプションに応じて、次の情報が表示されます。
プロセスの現在の状態
プロセス ID
親プロセス ID
ユーザー ID
スケジューリングクラス
優先順位
プロセスのアドレス
使用したメモリー
使用した CPU 時間
表 25-1 は、ps コマンドで表示されるフィールドの一部を示しています。どのフィールドが表示されるかは、選択するオプションによって異なります。使用可能なすべてのオプションについては、ps(1) のマニュアルページを参照してください。
表 25-1 ps により出力されるフィールド
フィールド |
説明 |
|
---|---|---|
UID |
プロセス所有者の実効ユーザー ID |
|
PID |
プロセスの識別番号 |
|
PPID |
親プロセスの識別番号 |
|
C |
スケジューリングのためのプロセッサ使用率。このフィールドは -c オプションを使用すると表示されない |
|
CLS |
プロセスが所属するスケジューリングクラス。リアルタイム、システム、またはタイムシェアリングのいずれか。このフィールドは、-c オプションを指定した場合にのみ表示される |
|
PRI |
カーネルスレッドのスケジューリング優先順位。番号が大きいほど優先順位が高い |
|
NI |
プロセスの nice 番号。これは、スケジュール優先順位に影響する。プロセスの nice 番号を大きくすると、その優先順位が下がる |
|
ADDR |
proc 構造体のアドレス |
|
SZ |
プロセスの仮想アドレスサイズ |
|
WCHAN |
プロセスが休眠中のイベントまたはロックのアドレス |
|
STIME |
プロセスの起動時刻 (時、分、秒) |
|
TTY |
プロセス (またはその親プロセス) が起動された端末。疑問符は、制御端末がないことを示す |
|
TIME |
プロセスの起動以降に使用した合計 CPU 時間 |
|
CMD |
プロセスを生成したコマンド |
システム上で実行中のすべてのプロセスを表示するには、ps コマンドを使用します。
$ ps [-ef]
ps |
ログインセッションに関連するプロセスのみを表示する |
-ef |
システム上で実行中のすべてのプロセスに関する詳細情報を表示する |
次の例は、オプションを指定しないときの ps コマンドからの出力を示します。
$ ps PID TTY TIME COMD 1664 pts/4 0:06 csh 2081 pts/4 0:00 ps
次の例は、ps -ef の出力を示します。この例は、システムのブート時に最初に実行されたプロセスが sched (スワッパ) であり、それに続いて init プロセス、pageout の順に実行されたことを示しています。
$ ps -ef UID PID PPID C STIME TTY TIME CMD root 0 0 0 May 05 ? 0:04 sched root 1 0 0 May 05 ? 10:48 /etc/init - root 2 0 0 May 05 ? 0:00 pageout root 3 0 0 May 05 ? 43:21 fsflush root 238 1 0 May 05 ? 0:00 /usr/lib/saf/sac -t 300 root 115 1 0 May 05 ? 0:10 /usr/sbin/rpcbind root 158 1 0 May 05 ? 0:00 /usr/lib/autofs/autom... root 134 1 0 May 05 ? 0:12 /usr/sbin/inetd -s root 107 1 0 May 05 ? 11:49 /usr/sbin/in.routed -q root 117 1 5 May 05 ? 899:32 /usr/sbin/keyserv root 125 1 0 May 05 ? 0:00 /usr/sbin/kerbd root 123 1 0 May 05 ? 4:17 /usr/sbin/nis_cachemgr root 137 1 0 May 05 ? 0:00 /usr/lib/nfs/statd root 139 1 0 May 05 ? 0:02 /usr/lib/nfs/lockd root 159 1 50 May 05 ? 8243:36 /usr/sbin/automount root 162 1 0 May 05 ? 0:07 /usr/sbin/syslogd root 181 1 0 May 05 ? 0:03 /usr/sbin/nscd... root 169 1 0 May 05 ? 5:09 /usr/sbin/cron root 191 1 0 May 05 ? 0:00 /usr/lib/lpsched root 210 1 0 May 05 ? 0:01 /usr/sbin/vold root 200 1 0 May 05 ? 0:08 /usr/lib/sendmail -bd -q1h root 4942 1 0 May 17 console 0:00 /usr/lib/saf/ttymon... root 208 1 0 May 05 ? 0:00 /usr/lib/utmpd root 241 238 0 May 05 ? 0:00 /usr/lib/saf/ttymon root 5748 134 0 17:09:49 ? 0:01 in.rlogind root 5750 5748 0 17:09:52 pts/0 0:00 -sh root 5770 5750 2 17:23:39 pts/0 0:00 ps -ef
/usr/proc/bin に入っているプロセスツールコマンドを使用すると、アクティブなプロセスに関する詳細な技術情報を表示できます。表 25-2 は、これらのプロセスツールを示しています。詳細は、proc(1) のマニュアルページを参照してください。
表 25-2 情報を表示する /usr/proc/bin のプロセスツール
プロセスツール |
表示される内容 |
---|---|
pcred |
資格 |
pfiles |
プロセス内で開いているファイルに関する fstat 情報と fcntl 情報 |
pflags |
/proc 追跡フラグ、保留状態のシグナルと保持状態のシグナル、他の状態情報 |
pldd |
プロセスにリンクされた動的ライブラリ |
pmap |
アドレス空間マップ |
psig |
シグナルの動作 |
pstack |
16 進 + シンボリックスタックトレース |
ptime |
microstate アカウンティングを使用するプロセス時間 |
ptree |
プロセスが入っているプロセスツリー |
pwait |
プロセス終了後の状態情報 |
pwdx |
プロセスの現在の作業ディレクトリ |
長いコマンド名を入力しなくてもすむように、プロセスツールディレクトリを PATH 変数に追加してください。これにより、各ファイル名の最後の部分 (たとえば、/usr/proc/bin/pwdx ではなく pwdx) を入力するだけで、プロセスツールを実行できます。
(省略可能) ps コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を調べます。
# ps -e | grep process
process |
詳細情報を表示したいプロセス名 |
プロセス識別番号は、出力の第 1 列目に表示されます。
適切な /usr/bin/proc コマンドを使用して必要な情報を表示します。
# /usr/proc/bin/pcommand pid
pcommand |
実行したいプロセスツールコマンド。表 25-2 を参照 |
pid |
プロセスの識別番号 |
次の例は、プロセスツールコマンドを使用して lpsched プロセスに関する詳細情報を表示する方法を示しています。まず、長いプロセスツールコマンドを入力しなくてもすむように、/usr/proc/bin path パスが定義されています。次に、lpsched の識別番号が表示されています。最後に、3 つのプロセスツールコマンドからの出力が表示されています。
1# PATH=$PATH:/usr/proc/bin # export PATH 2# ps -e | grep lpsched 191 ? 0:00 /usr/lib/lpsched 3# pwdx 191 191: / 4# ptree 191 183 /usr/lib/lpsched 5# pfiles 191 210: /usr/lib/lpsched Current rlimit: 1024 file descriptors 0: S_IFIFO mode:0000 dev:165,0 ino:83 uid:0 gid:0 size:0 O_RDWR 1: S_IFIFO mode:0000 dev:165,0 ino:83 uid:0 gid:0 size:0 O_RDWR 3: S_IFCHR mode:0666 dev:32,24 ino:34307 uid:0 gid:3 rdev:21,0 O_WRONLY FD_CLOEXEC 4: S_IFDOOR mode:0444 dev:171,0 ino:4124226512 uid:0 gid:0 size:0 O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[200] 5: S_IFREG mode:0664 dev:32,24 ino:311 uid:71 gid:8 size:0 O_WRONLY |
1. /usr/proc/bin ディレクトリを PATH 変数に追加します。
2. lpsched のプロセス識別番号を表示します。
3. lpsched の現在の作業ディレクトリを表示します。
4. lpsched が入っているプロセスツリーを表示します。
5. fstat と fcntl の情報を表示します。
次の例は、pwait コマンドからの出力を示しています。このコマンドは、プロセスが終了するまで待ってから、発生した処理に関する情報を表示します。次の例は、コマンドツールウィンドウを閉じた後の pwait コマンドからの出力を示しています。
$ ps -e | grep cmdtool 273 console 0:01 cmdtool 277 console 0:01 cmdtool 281 console 0:01 cmdtool $ pwait -v 281 281: terminated, wait status 0x0000
/usr/proc/bin に入っているプロセスツールを使用すると、プロセスの一部を制御できます。表 25-3 に、これらのプロセスツールを示します。詳細は、proc(1) のマニュアルページを参照してください。
表 25-3 制御を行う /usr/proc/bin のプロセスツール
プロセスツール |
機能 |
---|---|
pstop |
プロセスを停止する |
prun |
プロセスを再開する |
長いコマンド名を入力しなくてもすむように、プロセスツールディレクトリを PATH 変数に追加してください。これにより、各ファイル名の最後の部分 (たとえば、/usr/proc/bin/prun ではなく prun) を入力するだけで、プロセスツールを実行できます。
(省略可能) ps コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を調べます。
# ps -e | grep process
process |
詳細情報を表示したいプロセス名 |
プロセス識別番号は、出力の第 1 列目に表示されます。
適切な /usr/proc/bin コマンドを使用してプロセスを制御します。
# /usr/proc/bin/pcommand PID
pcommand |
実行したいプロセスツールコマンド。これらのコマンドについては、表 25-3 を参照 |
PID |
プロセスの識別番号 |
ps コマンドで、プロセスの状態を確認します。
# ps | grep PID
次の例は、プロセスツールを使用して印刷ツールを停止したり、再起動したりする方法を示しています。
プロセスを強制的に終了 (kill) させなければならない場合があります。プロセスが無限ループに入っていたり、大きいジョブを開始したが完了する前に停止したい場合があります。所有しているプロセスであれば、どれでも終了できます。また、スーパーユーザーはプロセス ID が 0、1、2、3、4 のものを除き、システム上のどんなプロセスでも終了できます。
詳細は、pkill(1) のマニュアルページを参照してください。
(省略可能) 別のユーザーが所有するプロセスを終了するには、スーパーユーザーになります。
(省略可能) pgrep コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を表示します。
$ pgrep process
process |
詳細情報を表示したいプロセス名 |
プロセスの識別番号は、出力の第 1 列目に表示されます。
pkill コマンドを使用してプロセスを終了します。
$ pkill [-9] PID ...
-9 |
プロセスを確実に終了させる |
PID . . . |
停止する 1 つ以上のプロセスの ID |
pgrep コマンドを使用して、プロセスが停止したことを確認します。
$ pgrep PID ...
次のリストは、システム上で構成されるクラスと、タイムシェアリングクラスのユーザー優先順位の範囲です。クラスの種類は次のとおりです。
システム (SYS)
対話型 (IA)
リアルタイム (RT)
プロセスのスケジュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。dispadmin コマンドの使用方法については、「スケジューラの構成」を参照してください。
priocntl(1) コマンドを使用すると、プロセスを優先順位クラスに割り当て、プロセスの優先順位を管理できます。プロセスを管理するための priocntl コマンドの使用方法については、「優先順位を指定する方法」を参照してください。
priocntl -l コマンドを使用すると、プロセスクラスとスケジューリングパラメタを表示できます。
$ priocntl -l
次の例に priocntl -l コマンドからの出力を示します。
$ priocntl -l CONFIGURED CLASSES ================== SYS (System Class) TS (Time Sharing) Configured TS User Priority Range: -20 through 20
ps コマンドを使用して、プロセスのグローバル優先順位を表示できます。
$ ps -ecl
グローバル優先順位は、PRI カラムの下に表示されます。
次の例は、ps -ecl からの出力を示しています。PRI カラム内のデータは、pageout が最上位の優先順位を持ち、sh が最下位の優先順位であることを示しています。
$ ps -ecl F S UID PID PPID CLS PRI ADDR SZ WCHAN TTY TIME COMD 19 T 0 0 0 SYS 96 f00d05a8 0 ? 0:03 sched 8 S 0 1 0 TS 50 ff0f4678 185 ff0f4848 ? 36:51 init 19 S 0 2 0 SYS 98 ff0f4018 0 f00c645c ? 0:01 pageout 19 S 0 3 0 SYS 60 ff0f5998 0 f00d0c68 ? 241:01 fsflush 8 S 0 269 1 TS 58 ff0f5338 303 ff49837e ? 0:07 sac 8 S 0 204 1 TS 43 ff2f6008 50 ff2f606e console 0:02 sh
指定した優先順位を持つプロセスを起動します。
# priocntl -e -c class -m userlimit-p pri command_name
-e |
コマンドを実行する |
-c class |
プロセスを実行する範囲のクラスを指定する。デフォルトのクラスは TS (タイムシェアリング) または RT (リアルタイム) |
-m userlimit |
-p オプションを使用するときに、優先順位を上下できる最大範囲を指定する |
-p pri command_name |
リアルタイムスレッド用に RT クラス内で相対優先順位を指定できるようにする。タイムシェアリングプロセスの場合は、-p オプションを使用すると -20 から +20 までのユーザー提供の優先順位を指定できる |
ps -ecl コマンドで、プロセスの状態を確認します。
# ps -ecl | grep command_name
次の例では、ユーザーが提供する最上位の優先順位を使用して find コマンドを起動します。
# priocntl -e -c TS -m 20 -p 20 find . -name core -print # ps -ecl | grep find
実行中のタイムシェアリングプロセスのスケジューリングパラメタを変更します。
# priocntl -s -m userlimit [-p userpriority] -i idtype idlist
-s |
ユーザー優先順位の範囲の上限を設定し、現在の優先順位を変更できる |
-m userlimit |
-p オプションを使用するときに、優先順位を上下できる最大範囲を指定する |
-p userpriority |
優先順位を指定できる |
-i idtype idlist |
idtype と idlist の組み合わせを使用してプロセスを識別する。idtype では PID や UID など、ID のタイプを指定する |
ps -ecl コマンドで、プロセスの状態を確認します。
# ps -ecl | grep idlist
次の例では、500 ミリ秒のタイムスライス、クラス RT 内の優先順位 20、グローバル優先順位 120 を指定して、コマンドを実行します。
# priocntl -e -c RT -t 500 -p 20 myprog # ps -ecl | grep myprog
プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはリアルタイムシェル内でスーパーユーザーであるか、作業中でなければなりません。
プロセスのクラスを変更します。
# priocntl -s -c class -i idtype idlist
-s |
ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更できる |
-c class |
クラス TS またはクラス RT を指定して、プロセスのクラスを変更する |
-i idtype idlist |
idtype と idlist の組み合わせを使用してプロセスを識別する。idtype では PID や UID など、ID のタイプを指定する |
ps -ecl コマンドで、プロセスの状態を確認します。
# ps -ecl | grep idlist
次の例では、ユーザー 15249 が所有するすべてのプロセスをリアルタイムプロセスに変更します。
# priocntl -s -c RT -i uid 15249 # ps -ecl | grep 15249
スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、その後ユーザーはリアルタイムのスケジューリングパラメタを (priocntl -s を使用して) 変更できません。
nice(1) コマンドは、SunOS の旧バージョンとの下位互換性を保つためにのみサポートされます。priocntl コマンドを使用する方がプロセスを柔軟に管理できます。
プロセスの優先順位は、そのスケジュールクラスポリシーと nice number 番号によって決定されます。各タイムシェアリングプロセスは、ユーザーが与えた優先順位を加算して計算されるグローバル優先順位を持っています。これは、nice コマンドまたは priocntl コマンド、およびシステムによって計算される優先順位の影響を受けます。
プロセスの実行優先順位番号は、オペレーティングシステムによって割り当てられ、スケジュールクラス、使用される CPU 時間、nice 値 (タイムシェアリングプロセスの場合) などの複数の要素によって決定されます。
各タイムシェアリングプロセスは、親プロセスから継承したデフォルトの nice 番号で起動します。nice 値は、ps レポートの NI カラムに表示されます。
ユーザーは、自分が与える nice 番号優先順位を大きくしてプロセスの優先順位を下げることができます。ただし、nice 番号を小さくしてプロセスの優先順位を上げることができるのは、スーパーユーザー (または root) だけです。これは、ユーザーが各自のプロセスの優先順位を大きくして CPU の独占比率を高めるのを防ぐためです。
nice 番号の範囲は 0 から +40 までで、0 は最上位の優先順位を与えます。デフォルト値は 20 です。nice コマンドには利用できるバージョンが 2 つあり、一方は標準バージョンの /usr/bin/nice で、他方は C シェルの一部となっているバージョンです。
nice 番号を変更して、コマンドやプロセスの優先順位を変更できます。プロセスの優先順位を下げるには、次のコマンドを使用します。
/usr/bin/nice command_name |
nice 番号を 4 単位で増やす (デフォルト) |
/usr/bin/nice +4 command_name |
nice 番号を 4 単位で増やす |
/usr/bin/nice -10 command_name |
nice 番号を 10 単位で増やす |
第 1 と第 2 のコマンドは、nice 番号を 4 単位で増やします (デフォルト)。第 3 のコマンドは、nice を 10 単位で増やしていますが負数の増分なので、プロセスの優先順位を下げます。
次のコマンドは、nice 番号を小さくしてコマンドの優先順位を上げます。
プロセスの優先順位を上げるには、次のコマンドを使用します。
/usr/bin/nice -10 command_name |
nice 番号を小さくしてコマンドの優先順位を上げる |
/usr/bin/nice -10 command_name |
nice 番号を小さくしてコマンドの優先順位を上げる。最初のマイナス記号はオプションの記号で、第 2 のマイナス記号は負の数を示す |
上記のコマンドでは、nice 番号を小さくしてコマンド command_name の優先順位を上げます。第 2 のコマンドでは、2 つのマイナス記号が必要なので注意してください。
同じユーザーが所有する複数の同じジョブがないかどうかを調べます。ジョブが終了するまで待たずに多数のバックグラウンドジョブを起動するスクリプトを実行した場合に、この問題が発生することがあります。
実行中のプロセスの優先順位が高すぎないかどうかを調べます。ps -c と入力して CLS フィールドを調べると、各プロセスのスケジューラクラスが表示されます。リアルタイム (RT) プロセスとして実行中のプロセスが CPU を独占している可能性があります。また、nice 値の大きいタイムシェアリング (TS) プロセスがないかどうかを調べます。スーパーユーザー特権を持つユーザーが、このプロセスの優先順位を上げすぎた可能性があります。システム管理者は、nice コマンドを使用して優先順位を下げることができます。