Solaris のシステム管理 (上級編)

第 23 章 システムプロセスの管理 (手順)

この章では、システムプロセスを管理する手順について説明します。この章で説明する手順は次のとおりです。

システムプロセスの管理に使用するコマンド (概要)

次の表では、プロセス情報を管理するために使用されるコマンドについて説明します。

表 23–1 プロセスを管理するためのコマンド

コマンド 

マニュアルページ 

説明 

ps pgrepprstat

ps(1)pgrep(1)prstat(1M)

システム上のアクティブなプロセスの状態をチェックする。また、プロセスについての詳細な情報を表示する 

dispadmin

dispadmin(1M)

デフォルトのスケジューリングポリシーをリストする 

priocntl

priocntl(1)

プロセスに優先順位クラスを割り当てて、プロセスの優先度を管理する 

nice

nice(1)

タイムシェアリングプロセスの優先度を変更する 

psrset

psrset(1M)

特定のプロセスグループを、1 つのプロセッサではなく、プロセッサのグループに結合する 

Solaris 管理コンソールの プロセスツールを使用すると、ユーザーフレンドリなインタフェースによるプロセスを管理できます。Solaris 管理コンソールの使用と起動の方法については、『Solaris のシステム管理 (基本編)』の「Solaris Management Console の操作 (手順)」を参照してください。

ps コマンド

ps コマンドを使用すると、システム上で活動中のプロセスの状態をチェックできます。また、プロセスについての技術的な情報も表示できます。このデータは、プロセスの優先順位をどのように設定するか判断するなどの管理作業に利用できます。

ps コマンドを使用すると、システム上で活動中のプロセスの状態をチェックできます。使用するオプションに応じて、次の情報が表示されます。

次の表では、ps コマンドを使用して報告されるいくつかのフィールドについて説明します。どのフィールドが表示されるかは、選択するオプションによって異なります。使用可能なすべてのオプションについては、ps(1) のマニュアルページを参照してください。

表 23–2 ps により出力されるフィールド

フィールド 

説明 

UID

プロセス所有者の実効ユーザー ID 

PID

プロセス ID 

PPID

親プロセス ID 

C

スケジューリングのためのプロセッサ使用率。このフィールドは -c オプションを使用すると表示されない

CLS

プロセスが所属するスケジューリングクラス。リアルタイム、システム、またはタイムシェアリングのいずれか。このフィールドは、-c オプションを指定した場合にのみ表示される

PRI

カーネルスレッドのスケジューリング優先順位。番号が大きいほど優先順位が高い 

NI

プロセスの nice 番号。これは、スケジュール優先順位に影響する。プロセスの nice 番号を大きくすると、その優先順位が下がる

ADDR

proc 構造体のアドレス

SZ

プロセスの仮想アドレスサイズ 

WCHAN

プロセスが休眠中のイベントまたはロックのアドレス 

STIME

プロセスの起動時刻 (時、分、秒) 

TTY

プロセス (またはその親プロセス) が起動された端末。疑問符は、制御端末がないことを示す 

TIME

プロセスの起動以降に使用した合計 CPU 時間 

CMD

プロセスを生成したコマンド 

プロセスを表示する方法

ps コマンドを使用して、システム上で実行中のすべてのプロセスを表示することができます。


$ ps [-efc]

ps

ログインセッションに関連するプロセスのみを表示する 

-ef

システム上で実行中のすべてのプロセスに関する詳細情報を表示する 

-c

プロセススケジューラ情報を表示する 

例 — プロセスを表示する

次の例は、オプションを指定しないときの 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   Dec 20 ?        0:17 sched
    root     1     0  0   Dec 20 ?        0:00 /etc/init -
    root     2     0  0   Dec 20 ?        0:00 pageout
    root     3     0  0   Dec 20 ?        4:20 fsflush
    root   374   367  0   Dec 20 ?        0:00 /usr/lib/saf/ttymon
    root   367     1  0   Dec 20 ?        0:00 /usr/lib/saf/sac -t 300
    root   126     1  0   Dec 20 ?        0:00 /usr/sbin/rpcbind
    root    54     1  0   Dec 20 ?        0:00 /usr/lib/sysevent/syseventd
    root    59     1  0   Dec 20 ?        0:00 /usr/lib/picl/picld
    root   178     1  0   Dec 20 ?        0:03 /usr/lib/autofs/automountd
    root   129     1  0   Dec 20 ?        0:00 /usr/sbin/keyserv
    root   213     1  0   Dec 20 ?        0:00 /usr/lib/lpsched
    root   154     1  0   Dec 20 ?        0:00 /usr/sbin/inetd -s
    root   139     1  0   Dec 20 ?        0:00 /usr/lib/netsvc/yp/ypbind ...
    root   191     1  0   Dec 20 ?        0:00 /usr/sbin/syslogd
    root   208     1  0   Dec 20 ?        0:02 /usr/sbin/nscd
    root   193     1  0   Dec 20 ?        0:00 /usr/sbin/cron
    root   174     1  0   Dec 20 ?        0:00 /usr/lib/nfs/lockd
  daemon   175     1  0   Dec 20 ?        0:00 /usr/lib/nfs/statd
    root   376     1  0   Dec 20 ?        0:00 /usr/lib/ssh/sshd
    root   226     1  0   Dec 20 ?        0:00 /usr/lib/power/powerd
    root   315     1  0   Dec 20 ?        0:00 /usr/lib/nfs/mountd
    root   237     1  0   Dec 20 ?        0:00 /usr/lib/utmpd
    .
    .
    .    

/proc ファイルシステムとコマンド

プロセスコマンドを使用すると、 /proc ディレクトリにあるプロセスに関する詳細情報を表示できます。/proc ディレクトリは プロセスファイルシステム (PROCFS) とも呼ばれます。アクティブなプロセスのイメージは、そのプロセス ID 番号を使って /proc に格納されます。

プロセスツールは ps コマンドの一部のオプションに似ていますが、このツールから提供される出力の方が詳細です。プロセスコマンドには次の機能があります。

/proc プロセスコマンドを使用したプロセスの管理

いくつかのプロセスコマンドを使用すると、アクティブなプロセスに関する詳細な技術情報を表示したり、そのプロセスを制御したりできます。 表 23–3に、いくつかの/proc コマンドを示します。

プロセスが無限ループ内でトラップされた場合や、実行時間が長すぎる場合は、プロセスを終了 (kill) できます。pkill コマンドを使用してプロセスを終了する方法については、第 23 章「システムプロセスの管理 (手順)」を参照してください。

/proc ファイルシステムは、状態情報と制御機能のためのサブディレクトリを含むディレクトリ階層です。

/proc ファイルシステムは、ウォッチポイント機能も提供します。この機能は、プロセスのアドレス領域の個々のページの読み取り権または書き込み権を再マップするために使用されます。この機能は制限がなく、MT-safe です。

デバッグ用ツールは、/proc の新しいウォッチポイント機能を使用するように変更されています。つまり、ウォッチポイントプロセス全体がより高速になったためです。

dbx デバッグ用ツールを使用してウォッチポイントを設定するときの次の制限は取り除かれました。

詳細については、proc(4)core(4)、および mdb(1) のマニュアルページを参照してください。

表 23–3 /proc プロセスコマンド

プロセスコマンド 

説明 

pcred

プロセスの資格情報を表示する 

pfiles

プロセス内で開いているファイルに関する fstat 情報と fcntl 情報を表示する

pflags

/proc 追跡フラグ、保留状態のシグナルと保持状態のシグナル、他の状態情報を出力する

pldd

プロセスにリンクされている動的ライブラリを表示する 

pmap

各プロセスのアドレス空間マップを表示する 

psig

各プロセスのシグナルの動作とハンドラを表示する 

prun

各プロセスを開始する 

pstack

各プロセス内の LWP の 16 進とシンボルのスタックトレースを出力する 

pstop

各プロセスを停止する 

ptime

microstate アカウントを使用してプロセスの時間を測定する

ptree

プロセスを含むプロセスツリーを表示する 

pwait

プロセス終了後の状態情報を表示する 

pwdx

プロセスの現在の作業ディレクトリを表示する 

詳細については、proc(1) のマニュアルページを参照してください。

プロセスに関する情報を表示する方法

  1. 詳細を表示したいプロセスのプロセス ID を表示します。


    # pgrep process
    

    process は、詳細を表示したいプロセスの名前です。

    プロセス ID は、出力の第 1 列目に表示されます。

  2. 表示したいプロセス情報を表示します。


    # /usr/bin/pcommand pid
    

    pcommand

    実行したいプロセスツールコマンド。表 23–3 を参照

    pid

    プロセス ID 

例 — プロセスに関する情報を表示する

次の例は、プロセスツールコマンドを使用して lpsched プロセスに関する詳細情報を表示する方法を示しています。


# pgrep lpsched 1
213
# pwdx 213 2
213:    /
# ptree 213 3
213   /usr/lib/lpsched
# pfiles 213 4
213:    /usr/lib/lpsched
  Current rlimit: 4096 file descriptors
   0: S_IFIFO mode:0000 dev:270,0 ino:67 uid:0 gid:0 size:0
      O_RDWR
   1: S_IFIFO mode:0000 dev:270,0 ino:67 uid:0 gid:0 size:0
      O_RDWR
   3: S_IFCHR mode:0666 dev:136,0 ino:35882 uid:0 gid:3 rdev:21,0
      O_WRONLY FD_CLOEXEC
   4: S_IFDOOR mode:0444 dev:275,0 ino:18526 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[208]
   5: S_IFREG mode:0664 dev:136,0 ino:64648 uid:71 gid:8 size:0
      O_WRONLY
  1. lpsched のプロセス ID を表示します。

  2. lpsched の現在の作業ディレクトリを表示します。

  3. lpsched が入っているプロセスツリーを表示します。

  4. fstatfcntl の情報を表示します。

プロセスを制御する方法

  1. 制御するプロセスのプロセス ID を表示します。


    # pgrep process
    

    process は、制御するプロセスの名前です。

    プロセスの ID は、出力の第 1 列目に表示されます。

  2. 適切なプロセスコマンドを使用してプロセスを制御します。


    # /usr/bin/pcommand pid
    

    pcommand

    実行したいプロセスコマンド。表 23–3 を参照

    pid

    プロセス ID 

  3. プロセス状態を確認します。


    # ps -ef | grep PID
    

例 — プロセスを制御する

次の例は、プロセスツールを使用して dtpad を停止し再開する方法を示しています。


# pgrep dtpad 1
2921
# pstop 2921 2
# prun 2921 3
  1. dtpad のプロセス ID を表示する

  2. dtpad プロセスを停止する

  3. dtpad プロセスを再開する

プロセスの終了 (pkill)

プロセスを強制的に終了 (kill) しなければならない場合があります。プロセスが無限ループに入っていたり、大きいジョブを開始したが完了する前に停止したい場合があります。所有しているプロセスであれば、どれでも終了できます。また、スーパーユーザーはプロセス ID が 01234 のものを除き、システム上のどんなプロセスでも終了できます。プロセス ID が 01234 のプロセスを終了させると、システムがクラッシュする可能性があります。

詳細については、pgrep(1) のマニュアルページを参照してください。

プロセスを終了させる方法

  1. (省略可能) 別のユーザーが所有するプロセスを終了するには、スーパーユーザーになります。

  2. 停止するプロセスのプロセス ID を表示します。


    $ pgrep process
    

    process は、詳細を表示するプロセスの名前です。

    プロセスの ID は、出力の第 1 列目に表示されます。

  3. プロセスを停止します。


    $ pkill [-9] pid 
    

    -9

    プロセスを確実に終了させる 

    pid

    停止するプロセス ID 

  4. プロセスが停止したことを確認します。


    $ pgrep process
    

プロセスクラス情報の管理

次のリストは、システム上で構成されるクラスと、タイムシェアリングクラスのユーザー優先順位の範囲です。クラスの種類は次のとおりです。

プロセスのスケジュール優先順位を変更する (priocntl)

プロセスのスケージュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。

priocntl コマンドを使用して、プロセスを優先順位クラスに割り当てて、プロセスの優先順位を管理できます。priocntl コマンドを使用してプロセスを管理する手順については、プロセスの優先順位を指定する方法 (priocntl)を参照してください。

プロセスクラスに関する基本情報を表示する方法 (priocntl)

priocntl -l コマンドを使用すると、プロセスのスケジューリングクラスと優先順位の範囲を表示できます。


$ priocntl -l

例—プロセスクラスに関する基本情報を表示する (priocntl)

次の例に priocntl -l コマンドからの出力を示します。


# priocntl -l
CONFIGURED CLASSES
==================

SYS (System Class)

TS (Time Sharing)
        Configured TS User Priority Range: -60 through 60

FX (Fixed priority)
        Configured FX User Priority Range: 0 through 60

IA (Interactive)
        Configured IA User Priority Range: -60 through 60

プロセスのグローバル優先順位を表示する方法 (ps)

ps コマンドを使用して、プロセスのグローバル優先順位を表示できます。


$ ps -ecl

グローバル優先順位は、PRI カラムの下に表示されます。

例—プロセスのグローバル優先順位を表示する (ps)

次の例は、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)

  1. スーパーユーザーになります。

  2. 指定した優先順位でプロセスを起動します。


    # priocntl -e -c class -m userlimit -p pri command-name
    

    -e

    コマンドを実行する 

    -c class

    プロセスを実行する範囲のクラスを指定する。有効なクラスは TS (タイムシェアリング)、RT (リアルタイム)、IA (対話型)、FSS (フェアシェア)、または FX (固定優先順位) です。

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する

    -p pri command-name

    リアルタイムスレッド用に RT クラス内で相対優先順位を指定できるようにする。タイムシェアリングプロセスの場合は、-p オプションを使用すると -60 から +60 までのユーザー指定の優先順位を指定できる

  3. プロセス状態を確認します。


    # ps -ecl | grep command-name
    

例—プロセスの優先順位を指定する (priocntl)

次の例では、ユーザーが指定する最上位の優先順位を使用して find コマンドを開始します。


# priocntl -e -c TS -m 60 -p 60 find . -name core -print
# ps -ecl | grep find

タイムシェアリングプロセスのスケジューリングパラメータを変更する方法 (priocntl)

  1. スーパーユーザーになります。

  2. 実行中のタイムシェアリングプロセスのスケジューリングパラメータを変更します。


    # priocntl -s -m userlimit [-p userpriority] -i idtype idlist
    

    -s

    ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更する 

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する

    -p userpriority

    優先順位を指定する 

    -i idtype idlist

    idtypeidlist の組み合わせを使用してプロセスを識別する。idtype では PIDUID など、ID のタイプを指定する。idlist を使用して、pid または UID のリストを識別する

  3. プロセス状態を確認します。


    # ps -ecl | grep idlist
    

例—タイムシェアリングプロセスのスケジューリングパラメータを変更する (priocntl)

次の例では、500 ミリ秒のタイムスライス、クラス RT 内の優先順位 20、グローバル優先順位 120 を指定して、コマンドを実行します。


# priocntl -e -c RT -t 500 -p 20 myprog
# ps -ecl | grep myprog

プロセスのクラスを変更する方法 (priocntl)

  1. (省略可能) スーパーユーザーになります。


    注 –

    プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはスーパーユーザーであるか、リアルタイムシェル内で作業中でなければなりません。


  2. プロセスのクラスを変更します。


    # priocntl -s -c class -i idtype idlist
    

    -s

    ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更する 

    -c class

    クラス TS またはクラス RT を指定して、プロセスのクラスを変更する

    -i idtype idlist

    idtypeidlist の組み合わせを使用してプロセスを識別する。idtype では PIDUID など、ID のタイプを指定する。idlist を使用して、pid または UID のリストを識別する

  3. プロセス状態を確認します。


    # ps -ecl | grep idlist
    

例—プロセスのクラスを変更する (priocntl)

次の例では、ユーザー 15249 が所有するすべてのプロセスをリアルタイムプロセスに変更します。


# priocntl -s -c RT -i uid 15249
# ps -ecl | grep 15249

注 –

スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、そのユーザーは priocntl -s を使用して、リアルタイムのスケジューリングパラメータを変更できません。


タイムシェアリングプロセスの優先順位を変更する (nice)

nice コマンドは、SunOS の旧バージョンとの下位互換性を保つためにのみサポートされます。priocntl コマンドを使用する方がプロセスを柔軟に管理できます。

プロセスの優先順位は、そのスケジュールクラスポリシーと nice 番号によって決定されます。各タイムシェアリングプロセスは、グローバル優先順位を持っています。グローバル優先順位は、ユーザーが指定した優先順位 (nice コマンドまたは priocntl コマンドの影響を受ける) とシステムで計算された優先順位を加算して算出されます。

プロセスの実行優先順位番号は、オペレーティングシステムによって割り当てられ、スケジュールクラス、使用される CPU 時間、 nice 値 (タイムシェアリングプロセスの場合) などの複数の要素によって決定されます。

各タイムシェアリングプロセスは、親プロセスから継承したデフォルトの nice 番号で起動します。nice 値は、ps レポートの NI カラムに表示されます。

ユーザーは、自分が与える nice 番号優先順位を大きくしてプロセスの優先順位を下げることができます。ただし、nice 番号を小さくしてプロセスの優先順位を上げることができるのは、スーパーユーザー (または root) だけです。これは、ユーザーが各自のプロセスの優先順位を大きくして CPU の独占比率を高めるのを防ぐためです。

nice 番号の範囲は 0 から +39 までで、0 が最上位の優先順位となります。各タイムシェアリングプロセスのデフォルト nice 値は 20 です。nice コマンドには利用できるバージョンが 2 つあり、1 つは標準バージョンの /usr/bin/nice で、もう 1 つは C シェル組み込みコマンドです。

プロセスの優先順位を変更する方法 (nice)


注 –

この節では /usr/bin/nice コマンドの構文についてだけ説明し、C シェル nice 組み込みコマンドについての説明は行いません。C シェル nice コマンドについては、 csh(1) のマニュアルページを参照してください。


  1. まず、ユーザーとしてコマンドの優先順位を下げるのか、あるいはスーパーユーザーとしてコマンドの優先順位を上げるのか下げるのかを決定してから、次のうちの 1 つを選択します。

    • 手順 2 の例に従って、ユーザーとしてコマンドの優先順位を下げる。

    • 手順 3 に従って、スーパーユーザーとしてコマンドの優先順位を上げるか、または下げる。

  2. ユーザーとして、 nice 番号を大きくすることでコマンドの優先順位を下げます。

    次の nice コマンドは、nice 番号を 5 単位分大きくすることで、 command-name を実行する優先順位を下げます。


    $ /usr/bin/nice -5 command-name
    
    上記のコマンドでは、マイナス記号は次にくるものがオプションであることを表します。このコマンドは、次のように指定することもできます。


    % /usr/bin/nice -n 5 command-name
    

    次の nice コマンドは、nice 番号をデフォルトの 10 単位分大きくすることで、 command-name の優先順位を下げます。ただし、最高値の 39 を超えさせることはできません。


    % /usr/bin/nice command-name
    
  3. スーパーユーザーとして、 nice 番号を変更することでコマンドの優先順位を上げるか、または下げます。

    次の nice コマンドは、nice 番号を 10 単位分小さくすることで、command-name の優先順位を上げます。ただし、最低値の 0 未満にすることはできません。


    # /usr/bin/nice --10 command-name     
    

    上記のコマンドでは、最初のマイナス記号は次にくるものがオプションであることを表します。2 番目のマイナス記号は負の数を表します。

    次の nice コマンドは、nice 番号を 5 単位分大きくすることで、 command-name の優先順位を下げます。ただし。最高値の 39 を超えさせることはできません。


    # /usr/bin/nice -5 command-name     
    

詳細については、nice(1) のマニュアルページを参照してください。

システムのプロセスに関する問題解決方法

すでに判明している問題の解決方法のヒントを次に示します。