Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2022年7月27日
 
 

prctl(1)

名前

prctl - 実行中のプロセス、タスク、およびプロジェクトのリソース制御の取得または設定

形式

prctl [-P] [-t basic|privileged|system] [-n name] [-o|-s|-r|-x]
     [-v value] [-e|-d action] [-p pid] [-i idtype] id...

説明

prctl ユーティリティーを使用すると、システム上のアクティブなプロセス、タスク、プロジェクト、またはゾーンに関連付けられているリソース制御 (rctl) に対して、確認や変更を行うことができます。これを使えば、指定されたエンティティー上の基本制限、特権付き制限、および現在の使用状況にアクセスできます。

次の 2 つの操作モードがあります。1 つめは、ターゲット rctl の rctl 値を出力する get 操作です。これは、–d–e–o–s–r–v、または –x オプションがどれも指定されていない場合に実行されます。–t オプションによって特権が指定されている場合、特権に一致する rctl 値だけが出力されます。それ以外の場合、すべての特権の rctl 値が出力されます。

Solaris オペレーティングシステムの現行リリースでサポートされているリソース制御については、resource-controls(7) を参照してください。

–n オプションによって名前が指定されている場合は、name によって指された rctlrctl 値だけが出力されます。それ以外の場合、ターゲットエンティティーおよびそのターゲットエンティティーが属するエンティティーのすべての rctl が出力されます。たとえば、名前を指定せずに、タスクに対して prctl を呼び出すと、ターゲットタスクのすべての rctl 値と、ターゲットタスクのプロジェクトとゾーンの rctl 値が出力されます。

出力する rctl 値がある rctl については、その使用状況が存在する場合に、その使用状況も出力されます。rctl に複数の rctl 値がある場合、それらが昇順で出力されます。さらに、呼び出し元は –P オプションを指定することによってマシン解析可能な出力を取得できます。取得操作の受け入れられるオプションのリストは、–i–n–t–P です。

操作の 2 つめのタイプは、変更操作です。変更操作では、name または rctl–n オプションによって明示的に指定する必要があります。変更操作は、次のように分割できます。

  • 挿入操作: 新しい rctl 値を指定した値と特権で挿入します。アクション変更または受信者 pid が指定され、有効である場合、それらが挿入される rctl 値に適用されます。値は明示的に指定する必要があり、特権が明示的に指定されていない場合、それは基本と想定されます。挿入操作を呼び出せる 3 つの方法があります。

    1. –s オプションの指定。

    2. –d–e–o–s–r–x オプションをどれも指定しないが、–v オプションを指定します。これは事実上、–s オプションを追加して同じコマンドを呼び出すことと同じです。

    3. 一致がなく、–v オプションが明示的に指定されているため、アクション変更操作が失敗しました。これは事実上、–s オプションを追加して同じコマンドを呼び出すことと同じです。

  • 上書き操作: 指定された特権のすべての rctl 値を削除し、指定された値と特権で新しい rctl 値を挿入します。アクション変更または受信者 pid が指定され、有効である場合、それらが挿入される rctl 値に適用されます。挿入操作として、–v オプションを明示的に指定する必要があり、特権が明示的に指定されていない場合、それは基本と想定されます。この操作は、–o オプションを指定して呼び出されます。

  • 削除操作: 指定された値と特権に一致した rctl 値を削除します。この操作は、–x オプションによって呼び出されます。削除操作では –d または –e オプションは許可されません。

  • 置換操作: 指定された特権によって rctl 値に一致し、その値を置き換えます。アクション変更または受信者 pid が指定され、有効である場合、それらが置換される rctl 値に適用されます。値は明示的に指定する必要があります。この操作は –r オプションによって呼び出されます。

    アクション変更操作: 指定された値と特権によって rctl 値に一致し、そのアクションを変更します。受信者 pid が指定され、有効である場合、それが変更される rctl 値に適用されます。この操作は –o–r–s–x オプションなしで –d または –e オプションによって呼び出されます。変更するための一致する rctl 値がなく、値が明示的に指定されている場合、挿入操作は、–s オプションを追加して同じコマンドを呼び出す場合と同様に呼び出されます。

一部の操作は、指定された値または特権に基づいた照合によって、ターゲット rctl 値を見つけます。照合によって、指定された条件に一致する最初の rctl 値が返されます。これらのどの引数も検索に指定されていない場合、対応するプロパティーは常に一致とみなされます。結果として、検索引数が何も指定されていない場合、ターゲット rctl の最初の rctl 値が一致しているものになります。

シグナルアクションの基本 rctl 値には受信者 pid が含まれます。新しい rctl 値を挿入するか、または既存の rctl 値を置き換える際に、結果の rctl 値に受信者 pid が含まれる場合、呼び出し元は、–p オプションによって明示的にそれを指定できます。結果の rctl 値に受信者 pid が含まれる場合に、呼び出し元が受信者 pid を指定しない場合、prctl は次の場合に受信者 pid を選択します。

  • ターゲットエンティティーがプロセスである場合、そのプロセスの pid が使用されます。

  • prctl が既存の rctl 値を変更し、その rctl 値に受信者 pid が含まれる場合、prctl は同じ値を使用します。

prctl が前述の規則に基づいて受信者 pid を選択できない場合は、失敗します。このコマンドが失敗する可能性のある理由には次のものが含まれます。

  • ターゲット rctl 値の無効な引数で、特に、RCTL_GLOBAL_NOBASIC フラグで許可されていない場合に RCPRIV_BASIC を指定しています。詳細については、rctlblk_get_global_flags(3C) のマニュアルページを参照してください。

  • ターゲット rctl に rctl 値が多すぎる場合、挿入および上書きが失敗することがあります。

  • 新しい rctl 値を挿入または変更するときに、rctl に結果の rctl 値がすでにある場合、rctl には重複した rctl 値が存在できないため、prctl が失敗します。

  • 新しい rctl 値の挿入を試みるアクション変更操作に記述されている場合を除き、一致する rctl 値の検索は失敗します。

  • 要求された rctl 値の変更は、呼び出し元の特権の範囲外です。詳細については、setrctl(2) のマニュアルページを参照してください。

Oracle Solaris オペレーティングシステムの現在のリリースでサポートされているリソース制御については、resource-controls(7) のマニュアルページを参照してください。

オプション

–s–r–x–v–d–e のいずれのオプションも指定されなかった場合、その呼び出しは取得処理とみなされます。それ以外の場合、それは変更処理とみなされます。

サポートしているオプションは、次のとおりです。

–d | –e action

rctl 値で指定されたアクションを無効 (–d) または有効 (–e) にします。

アクション:

all

このアクションは –d でのみ使用できます。これは、すべてのアクションを無効化します。これは、deny 大域フラグを持つリソース制御値では失敗します。

deny

プロセス、タスク、プロジェクト、またはゾーンからのリソース要求がリソース制御値を超えた場合に、リソース制御がその要求を拒否しようとすることを示します。no-deny 大域フラグを持つリソース制御では、deny アクションは有効にできません。deny 大域フラグを持つリソース制御では、deny アクションは無効にできません。

signal

このアクションは –d でのみ使用できます。signal アクションをすべて非アクティブにします。

signal=signum

特定のシグナルアクションを有効または無効にします。signum はシグナルのシグナル番号または文字列表現で、「SIG」接頭辞を省略でき、文字列は大文字と小文字が区別されます。つまり、「TERm」は SIGTERM として認識されます。no-local-action 大域フラグを持つリソース制御上に signal アクションを設定すると、失敗します。rctl 値に設定可能な有効なシグナルは、SIGABRTSIGXRESSIGHUPSIGSTOPSIGTERM、および SIGKILL です。これに加え、CPU 時間関連の制御は SIGXCPU シグナルを発行でき、ファイルサイズ関連の制御は SIGXFSZ シグナルを送信できます。

signal=signum アクションの signum は、シグナル番号 (またはシグナルの文字列表現) です。no-local-action 大域フラグを持つリソース制御上に signal アクションを設定すると、失敗します。送信可能なシグナルは限られています。詳細については、「注意事項」を参照してください。

–i idtype

ID オペランドのタイプを指定します。有効な idtype は、processtaskproject、または zone です。また、pidtaskidprojid、および zoneid も使用できます。–i オプションが省略された場合のデフォルトの ID タイプは、process です。

–n name

取得または変更するリソース制御の名前を指定します。名前はエンティティーの rctl を参照する必要があり、–i オプションによって指定されたターゲットエンティティーに属しているべきです。たとえば、–n オプション、タスク (–i taskid) のプロジェクト rctl を渡すことは許可されますが、その逆は許可されません。

–p pid

必要に応じて、挿入または変更される rctl 値の受信者 pid を指定します。このオプションは、基本特権が許可されていないか、または基本以外の特権が明示的に指定されている場合に許可されません。

–P

リソース制御値をスペース文字で区切られた形式で表示します。取得操作に対してのみ許可されます。

–r

置換操作を呼び出します。

–s

挿入操作を呼び出します。

–t basic|privileged|system

取得または変更するリソース制御タイプを指定します。privileged の代わりに値 priv は許可されます。

–v value

変更操作のリソース制御の値を指定します。

リソース制御値の設定時に大きな値を表現するために使用可能な単位修飾子や倍率については、resource-controls(7) を参照してください。

–x

削除操作を呼び出します。

オペランド

次のオペランドを指定できます。

id

問い合わせるエンティティー (processtaskprojectzone のいずれか) の ID。project および zone の場合、数値 ID の代わりにエンティティー名も認識されます。id が指定されなかった場合、エラーメッセージが返されます。

使用例 1 現在のリソース制御設定の表示

次の例では、現在のシェルが所属するタスクの現在のリソース制御設定を表示しています。

 example$ ps -o taskid -p $$
TASKID
234
example$ prctl -i task 234
task: 234
NAME    PRIVILEGE       VALUE    FLAG   ACTION             RECIPIENT
task.max-cpu-time
        usage            8s
        system          18.4Es    inf   none                -
task.max-lwps
        usage              39
        system          2.15G     max   deny                -
project.max-contracts
        privileged      10.0K       -   deny                -
project.max-locked-memory
        usage               0B
        privileged       508MB      -   deny                -
project.max-port-ids
        privileged      8.19K       -   deny                -
project.max-shm-memory
        privileged       508MB      -   deny                -
project.max-shm-ids
        privileged        128       -   deny                -
project.max-msg-ids
        privileged        128       -   deny                -
project.max-sem-ids
        privileged        128       -   deny                -
project.max-crypto-memory
         usage            0B
privileged       508MB      -   deny                -
project.max-tasks
        usage               2
        system          2.15G     max   deny                -
project.max-lwps
         usage             39
        system          2.15G     max   deny                -
project.cpu-shares
        usage               1
        privileged          1       -   none                -
zone.max-shm-memory
        system          16.0EB    max   deny                -
zone.max-shm-ids
        system          16.8M     max   deny                -
zone.max-sem-ids
        system          16.8M     max   deny                -
zone.max-msg-ids
        system          16.8M     max   deny                -
zone.max-lwps
        system          2.15G     max   deny                -
zone.cpu-shares
        privileged          1       -   none                -
zone.max-locked-memory
        usage               0B
        privileged       508MB      -   deny                -

使用例 2 特定の制御の値の表示、置換、および確認

次の例では、ある既存プロジェクト上の特定の制御の値を表示、置換、および確認しています。


example# prctl -n project.cpu-shares -i project group.staff
project: 10: group.staff
NAME    PRIVILEGE       VALUE    FLAG   ACTION               RECIPIENT
project.cpu-shares
        usage               1
        privileged          1       -   none                         -
        system          65.5K     max   none                         -

example# prctl -n project.cpu-shares -v 10 -r -i project group.staff
example# prctl -n project.cpu-shares -i project group.staff
project: 10: group.staff
NAME    PRIVILEGE       VALUE    FLAG   ACTION               RECIPIENT
project.cpu-shares
        usage              10
        privileged         10       -   none                         -
        system          65.5K     max   none                         -

使用例 3 リソースの調整

次の例では、project.max-locked-memory リソースを使用しています。

最初に、id –p を使用して、現在のシェルが所属しているプロジェクトを検出します。


/home/garfield> id -p
          uid=77880(garfield) gid=10(staff) projid=10(group.staff)

変更を行う前に、ターゲットプロジェクトを使用してリソースの制限値を識別します。


/home/garfield> prctl -n project.max-locked-memory -i project \
                      group.staff
	project 10: group.staff
	project.max-locked-memory
            privileged         256MB       -    deny                  -
      	    system            16.0EB     max    deny                  -

current limit is 256 Megabytes.

次に、ターゲットプロジェクトに対して、project.max-locked-memory の制限を 300M バイトに調整します。


# prctl -n project.max-locked-memory -v 300M -r -i project group.staff

変更後のリソースの制限値が、新しい値 300M バイトを示しています。


# prctl -n project.max-locked-memory -i project group.staff
	project 10:group.staff
	project.max-locked-memory
	    usage              200MG
     privileged         300MB       -    deny                           -
	   system            16.0EB     max    deny                           -
使用例 4 プロジェクトの CPU キャップを変更する

prctl コマンドは、project.cpu-cap リソース制御 (resource-controls(7) を参照) を使用して、プロジェクトの CPU キャップを設定したり変更したりできます。(/etc/project ファイルでも同じリソース制御を使用できます。project(5) を参照) 次のコマンドは、user.smith を 3 つの CPU に制限するように CPU キャップを変更します。

# prctl -r -t privileged -n project.cpu-cap -v 300 -i project user.smith

上で使用されている prctl –r オプションは、プロジェクトまたはゾーンの CPU キャップを動的に変更するために使用されます。たとえば、次のコマンドは、前のコマンドで設定されたキャップを 80%に変更します。

# prctl -r -t privileged -n project.cpu-cap -v 80 -i project user.smith

CPU キャップを削除するには、次のように入力します。

# prctl -x -n project.cpu-cap $$
使用例 5 ゾーンの CPU キャップを変更する

prctl コマンドは、zone.cpu-cap リソース制御 (resource-controls(7) を参照) を使用して、ゾーンの CPU キャップを設定したり変更したりできます。(zonecfg(8) コマンドを使用して、同じリソース制御を操作できます。)次のコマンドは、大域ゾーンを CPU の 80%に制限するように CPU キャップを変更します。

# prctl -t privileged -n zone.cpu-cap -v 80 -i zone global

キャップを 50% に削減するには、次のコマンドを使用します。

# prctl -r -t privileged -n zone.cpu-cap -v 50 -i zone global

終了ステータス

次の終了ステータスが返されます。

0

成功。

1

致命的なエラーが発生しました。

2

無効なコマンド行オプションが指定された。

ファイル

/proc/pid/*

プロセス情報および制御ファイル

属性

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

属性タイプ
属性値
使用条件
system/core-os
インタフェースの安定性
下記を参照。

コマンド行の構文は「確実」です。人間が読める形式の出力は「不確実」です。機械可読な出力は「確実」です。

関連項目

setrctl(2), rctlblk_get_local_action(3C), project(5), attributes(7), resource-controls(7), rctladm(8), zonecfg(8)