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

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

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

システムプロセスの管理に関する手順については、以下を参照してください。

システムプロセスの管理に関する基本情報については、以下を参照してください。

システムプロセスの管理 (作業マップ)

作業 

説明 

参照先 

プロセスを表示する 

ps コマンドを使用して、システム上のすべてのプロセスを表示する

「プロセスを表示する方法」

プロセスについての情報を表示する 

pgrep コマンドを使用して、詳細情報を表示したいプロセスのプロセス ID を取得する

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

プロセスを制御する 

pgrep コマンドを使用して、プロセスを見つける。その後、適切な pcommand (/proc) を使用し、プロセスを制御する。(/proc) コマンドについては、表 12–3 を参照

「プロセスを制御する方法」

プロセスを強制終了する 

 

プロセス名かプロセス ID を使用し、プロセスを見つける。pkill コマンドまたは kill コマンドを使用し、プロセスを終了する

 

「プロセスを終了させる方法 (pkill)」

「プロセスを終了させる方法 (kill)」

システムプロセスを管理するコマンド

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

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

コマンド  

説明 

マニュアルページ 

ps, pgrep, prstat, pkill

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

ps(1)pgrep(1)、および prstat(1M)

pkill

pgrep と同様に機能するが、名前または他の属性によってプロセスを検索またはシグナルを送信して、プロセスを終了します。一致したプロセスのプロセス ID を出力するのではなく、kill コマンドと同様に、各プロセスにシグナルを送信します。

pgrep(1) および pkill(1)

kill(1)

pargs, preap

プロセスのデバッグを支援します。 

pargs(1) および preap(1)

dispadmin

デフォルトのプロセススケジューリングポリシーを表示します。 

dispadmin(1M)

priocntl

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

priocntl(1)

nice

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

nice(1)

psrset

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

psrset(1M)

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

ps コマンドの使用

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

使用するオプションに応じて、ps コマンドは以下の情報を報告します。

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

表 12–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

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

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

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

表 12–3 プロセスコマンド (/proc)

プロセスコマンド 

説明 

pcred

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

pfiles

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

pflags

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

pldd

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

pmap

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

psig

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

prun

各プロセスを開始する 

pstack

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

pstop

各プロセスを停止する 

ptime

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

ptree

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

pwait

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

pwdx

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

詳細については、proc(1) を参照してください。

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

プロセスコマンドには次の機能があります。

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

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

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

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

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

デバッグ用ツールは、/proc の xwatchpoint 機能を使用するように変更されています。つまり、xwatchpoint プロセス全体がより高速になっています。

dbx デバッグ用ツールを使用して xwatchpoint を設定する際の、次の制限はなくなりました。

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

Procedureプロセスを表示する方法

  1. ps コマンドを使用すると、システム上の全プロセスを表示できます。


    $ ps [-efc]
    ps

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

    -ef

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

    -c

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


例 12–1 プロセスを表示する

次の例は、オプションを指定しないときの 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
    .
    .
    .    

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

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


    # pgrep process
    

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

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

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


    # /usr/bin/pcommand pid
    
    pcommand

    実行したい (/proc) コマンド。これらのコマンドについては表 12–3 を参照

    pid

    プロセス ID


例 12–2 プロセスに関する情報を表示する

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


# pgrep cron 1
4780
# pwdx 4780 2
4780:   /var/spool/cron/atjobs
# ptree 4780 3
4780  /usr/sbin/cron
# pfiles 4780 4
4780:   /usr/sbin/cron
  Current rlimit: 256 file descriptors
   0: S_IFCHR mode:0666 dev:290,0 ino:6815752 uid:0 gid:3 rdev:13,2
      O_RDONLY|O_LARGEFILE
      /devices/pseudo/mm@0:null
   1: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /var/cron/log
   2: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /var/cron/log
   3: S_IFIFO mode:0600 dev:32,128 ino:42049 uid:0 gid:0 size:0
      O_RDWR|O_LARGEFILE
      /etc/cron.d/FIFO
   4: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK
   5: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
      O_RDWR
  1. cron プロセスのプロセス ID を表示する。

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

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

  4. fstatfcntl の情報を表示する


Procedureプロセスを制御する方法

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


    # pgrep process
    

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

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

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


    # /usr/bin/pcommand pid
    
    pcommand

    実行したいプロセス (/proc) コマンド。これらのコマンドについては表 12–3 を参照

    pid

    プロセス ID

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


    # ps -ef | grep pid
    

例 12–3 プロセスを制御する

次の例は、プロセスコマンドを使用して dtpad プロセスを停止し再開する方法を示しています。


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

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

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


プロセスの終了 (pkill, kill)

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

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

Procedureプロセスを終了させる方法 (pkill)

  1. (省略可能) 別のユーザーのプロセスを終了するには、スーパーユーザーになるか、同等の役割になります。

  2. 終了したいプロセスのプロセス ID を表示します。


    $ pgrep process
    

    process は、終了したいプロセスの名前です。

    次に例を示します。


    $ pgrep netscape
    587
    566

    プロセス ID が出力に表示されます。


    注 –

    Sun Ray のプロセス情報を表示するには、次のコマンドを使用します。


    # ps -fu user
    

    このコマンドは、このユーザーのすべてのプロセスを表示します。


    # ps -fu user | grep process
    

    このコマンドは、ユーザーの特定のプロセスを検索します。


  3. プロセスを終了します。


    $ pkill [signal] process
    
    signal

    pkill コマンド行構文にシグナルが何も含まれない場合は、使用されるデフォルトシグナルは -15 (SIGKILL)。-9 シグナル (SIGTERM) を pkill コマンドで使用すると、プロセスをただちに終了できる。ただし -9 シグナルは、データベースプロセスや LDAP サーバープロセスなどのプロセスを終了するために使用してはならない。データが失われる可能性がある

    process

    停止するプロセスの名前


    ヒント –

    pkill コマンドを使用してプロセスを終了する場合は、まず、シグナルオプションを使用せずにコマンドだけで試行してみます。数分待ってプロセスが終了しなければ、pkill コマンドに -9 シグナルを付けて使用します。


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


    $ pgrep process
    

    終了したプロセスは、pgrep コマンドの出力に表示されないはずです。

Procedureプロセスを終了させる方法 (kill)

  1. (省略可能) 別のユーザーのプロセスを終了するには、スーパーユーザーになるか、同等の役割になります。

  2. 終了したいプロセスのプロセス ID を表示します。


    $ ps -fu user
    

    user は、プロセスを表示したいユーザーです。

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

  3. プロセスを終了します。


    $ kill [signal-number] pid
    
    signal

    pkill コマンド行構文にシグナルが何も含まれない場合は、使用されるデフォルトシグナルは -15 (SIGKILL)。-9 シグナル (SIGTERM) を pkill コマンドで使用すると、プロセスをただちに終了できる。ただし -9 シグナルは、データベースプロセスや LDAP サーバープロセスなどのプロセスを終了するために使用してはならない。データが失われる可能性がある

    pid

    終了したいプロセスのプロセス ID


    ヒント –

    kill コマンドを使用してプロセスを終了する場合は、まず、シグナルオプションを使用せずにコマンドだけで試行してみます。数分待ってプロセスが終了しなければ、kill コマンドに -9 シグナルを付けて使用します。


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


    $ pgrep pid
    

    終了したプロセスは、pgrep コマンドの出力に表示されないはずです。

プロセスのデバッグ (pargs, preap)

pargs コマンドと preap コマンドは、プロセスのデバッグを改善します。pargs コマンドを使用すると、動作中のプロセスまたはコアファイルに関連付けられた引数と環境変数を表示できます。preap コマンドを使用すると、終了した (ゾンビ) プロセスを削除できます。ゾンビプロセスとは、その終了状態がまだ親に回収されていないプロセスをいいます。これらのプロセスは概して無害ですが、数が多ければシステム資源を消費します。pargs コマンドと preap コマンドを使用して、ユーザーの検査権限に含まれるすべてのプロセスを検査できます。スーパーユーザーは、すべてのプロセスを検査できます。

preap コマンドの使用方法については、preap(1) のマニュアルページを参照してください。pargs コマンドの使用方法については、pargs(1) のマニュアルページを参照してください。また、proc(1) のマニュアルページも参照してください。


例 12–4 プロセスをデバッグする (pargs)

pargs コマンドによって、プロセスに渡された引数を ps コマンドで一部しか表示できないという問題がようやく解決されました。次の例は、pargsコマンドを pgrep コマンドと併用して、プロセスに渡された引数を表示する方法を示します。


# pargs `pgrep ttymon`
579:	/usr/lib/saf/ttymon -g -h -p system-name console login:  
-T sun -d /dev/console -l 
argv[0]: /usr/lib/saf/ttymon
argv[1]: -g
argv[2]: -h
argv[3]: -p
argv[4]: system-name console login: 
argv[5]: -T
argv[6]: sun
argv[7]: -d
argv[8]: /dev/console
argv[9]: -l
argv[10]: console
argv[11]: -m
argv[12]: ldterm,ttcompat
548:	/usr/lib/saf/ttymon
argv[0]: /usr/lib/saf/ttymon

次の例は、pargs -e コマンドを使用して、プロセスに関連付けられた環境変数を表示する方法を示します。


$ pargs -e 6763
6763: tcsh
envp[0]: DISPLAY=:0.0

プロセスクラス情報の管理 (作業マップ)

作業 

説明 

参照先 

プロセスクラスに関する基本情報を表示する 

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

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

プロセスのグローバル優先順位を表示する 

ps -ecl コマンドを使用し、プロセスのグローバル優先順位を表示する

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

プロセスに優先順位を割り当てる 

priocntl - e -c コマンドを使用し、割り当てた優先順位でプロセスを開始する

「プロセスの優先順位を指定する方法 (priocntl)」

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

priocntl -s -m コマンドを使用し、タイムシェアリングプロセスのスケジューリングパラメータを変更する

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

プロセスのクラスを変更する 

priocntl -s -c コマンドを使用し、プロセスのクラスを変更する

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

プロセスの優先順位を変更する 

/usr/bin/nice コマンドを適切なオプションとともに使用し、プロセスの優先順位を低くしたり高くしたりする

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

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

次のリストは、システム上で構成可能なプロセススケジューリングクラスを示しています。タイムシェアリングクラスのユーザー優先順位の範囲も示しています。

プロセススケジューリングクラスの種類は次のとおりです。

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

プロセスのスケジュール優先順位とは、スケジュールポリシーに従ってプロセススケジューラによって割り当てられる優先順位のことです。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。詳細は、dispadmin(1M) のマニュアルページを参照してください。

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

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

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


    $ priocntl -l
    

例 12–5 プロセスクラスに関する基本情報を表示する (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

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

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


    $ ps -ecl
    

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


例 12–6 プロセスのグローバル優先順位を表示する

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

Procedureプロセスの優先順位を指定する方法 (priocntl)

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

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


    # priocntl -e -c class -m user-limit -p pri command-name
    
    -e

    コマンドを実行する

    -c class

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

    -m user-limit

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

    -p pri command-name

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

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


    # ps -ecl | grep command-name
    

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

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


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

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

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

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


    # priocntl -s -m user-limit [-p user-priority] -i idtype idlist
    
    -s

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

    -m user-limit

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

    -p user-priority

    優先順位を指定する

    -i xidtype xidlist

    xidtypexidlist の組み合わせを使用してプロセスを識別する。「xidtype」ではプロセス ID やユーザー ID など、ID のタイプを指定する。「xidlist」ではプロセス ID またはユーザー ID のリストを識別する

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


    # ps -ecl | grep idlist
    

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

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


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

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

  1. (省略可能) スーパーユーザーまたは同等の役割になります。

  2. プロセスのクラスを変更する


    # priocntl -s -c class -i idtype idlist
    
    -s

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

    -c class

    クラス TS (タイムシェアリング) または RT (リアルタイム) を指定して、プロセスのクラスを変更する

    -i idtype idlist

    xidtypexidlist の組み合わせを使用してプロセスを識別する。xidtype ではプロセス ID やユーザー ID など、ID のタイプを指定する。「xidlist」ではプロセス ID またはユーザー ID のリストを識別する


    注 –

    プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはスーパーユーザーであるか、リアルタイムシェル内で作業中でなければなりません。スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、そのユーザーは priocntl -s を使用して、リアルタイムのスケジューリングパラメータを変更できません。


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


    # ps -ecl | grep idlist
    

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

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


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

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

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

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

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

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

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

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

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

この方法により、ユーザーがプロセスの優先順位を下げることができます。ただし、スーパーユーザーはプロセスの優先順位を上げたり、下げたりすることができます。


注 –

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

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

よくある問題に関するヒントを次に示します。