手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

prctl(1)

名称

prctl - 获取或设置正在运行的进程、任务和项目的资源控制

用法概要

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

描述

使用 prctl 实用程序,可以检查和修改与系统中的活动进程、任务或项目相关联的资源控制。它允许访问基本限制和特权限制以及当前在指定实体上使用的限制。

有关当前发行版的 Solaris 操作系统中支持的资源控制的说明,请参见 resource_controls (5)。

选项

如果未指定 –s、–r、–x、–v、–d 或 –e 选项中的任何一个,则调用被视为获取操作。否则,它被视为修改操作。

支持以下选项:

–d | –e action

对 –v、–t 和 –p 指定的资源控制值禁用 (–d) 或启用 (–e) 指定的 action。如果未指定 –v、–t 或 –p 选项中的任何一个,则它们与任何值、特权或接收者 pid 都匹配。例如,仅指定 –v 将修改具有匹配的值且与任意特权和接收者 pid 匹配的第一个资源控制。如果未找到匹配的资源控制值,则按指定了 –s 时的方式添加新值。

操作:

all

此操作仅适用于 –d。它将禁用所有操作。对于具有 deny 全局标志的资源控制值,此操作将失败。

deny

表示资源控制尝试拒绝向所请求的资源超出了资源控制值的请求上的进程、任务、项目或区域授予资源。如果资源控制具有 no-deny 全局标志,则无法启用 deny 操作。如果资源控制具有 deny 全局标志,则无法禁用 deny 操作。

signal

此操作仅适用于 –d。它将停用 signal 操作。

signal=signum

在 signal=signum 操作中,signum 是一个信号编号(或信号的字符串表示形式)。对具有 no-local-action 全局标志的资源控制设置 signal 操作会失败。可以发送一组有限的信号。有关其他详细信息,请参见“附注”部分。

–i idtype

指定 id 操作数的类型。有效的 idtype 为 process、task、project 或 zone。还可以为 pid、taskid、projid 和 zoneid。如果省略了 –i 选项,则缺省 id 类型为 process。

对于修改操作,id 操作数归属的实体是目标实体。例如,在 –i process 上设置一个项目资源控制将会在每个给定进程参数归属的项目上设置该资源控制。

对于获取操作,将为 id 操作数归属的所有实体列出资源控制。例如,–i task taskid 将为任务以及该任务归属的项目和区域列出任务、项目和区域资源控制。

–n name

指定要获取或设置的资源控制的名称。如果未指定 name,将检索所有资源控制。

–p pid

处理基本任务项目或区域资源控制值时(使用 –s、–r、–x、–d 或 –e),可使用 –p 指定接收者 pid。在任务、项目或区域上设置一个或多个新的基本资源控制时,如果 –i idtype 选项参数不是 process,则 –p 选项是必需的。

–P

以空格分隔形式显示资源控制值。

–r

使用通过 –v 选项指定的新值替换第一个资源控制值(与 –t privilege 相匹配的)。

–s

设置一个新的资源控制值。

此选项需要 –v 选项。

如果未指定 –t 选项,则使用基本特权。如果要设置基本任务、进程或区域资源控制,则需要 –p。如果还指定了 –e 或 –d,则也将设置对新的资源控制的操作。

为了与早期版本兼容,如果指定了 –v 且未指定 –e、–d、–r 或 –x 中的任何一个,则会隐式包含此选项。

有关设置资源控制值时可用于表示大值的单位修饰符和比例因子的说明,请参见 resource_controls (5)。

–t [ basic | privileged | system ]

指定要设置的资源控制类型。除非为资源控制设置了 "lowerable" 标志,否则只有其特权等效于 root 的用户(或 setuid 程序)执行的调用可修改特权资源控制。有关 RCTL_GLOBAL_LOWERABLE 标志的说明,请参见 rctlblk_set_value(3C)。如果未指定类型,则采用 basic。对于获取操作,如果未指定类型,则将显示所有资源控制类型的值,包括 system。

–v value

为设置操作指定资源控制值。如果未指定 value,则将在给定类型的具有最低值的资源控制上执行修改(删除、启用或禁用操作)。

有关设置资源控制值时可用于表示大值的单位修饰符和比例因子的说明,请参见 resource_controls (5)。

–x

删除指定的资源控制值。如果未提供删除选项,则 prctl 的缺省操作是修改具有匹配的值和特权的资源控制值,或插入具有给定特权的新值。setrctl(2) 中更完整地讨论了匹配条件。

如果未指定 –d、–e、–v 或 –x 选项中的任何一个,则调用被认为是获取操作。

操作数

支持下列操作数:

id

要查询的实体(process、task、project 或 zone)的 ID。如果调用方用户的凭证没有特权,且正被查询的实体拥有不同的凭证,则操作将失败。如果未指定 id,则将返回一条错误消息。

示例

示例 1 显示当前的资源控制设置

以下示例显示当前 shell 所属任务的当前资源控制设置:

 example$ ps -o taskid -p $$
TASKID
8
example$ prctl -i task 8
136150: /bin/ksh
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 找出当前 shell 是哪个项目的成员:


/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 (5))设置和修改项目的 CPU 上限。(可在 /etc/project 文件中使用相同的资源控制。请参见 project(4))。以下命令将修改 CPU 上限,将 user.smith 限制到三个 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 (5))设置和修改区域的 CPU 上限。(可使用 zonecfg(1M) 命令操控相同的资源控制。)以下命令将修改 CPU 上限,将全局区域限制到 CPU 的 80%:

# 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(5):

属性类型
属性值
可用性
system/core-os
接口稳定性
请参见下文。

命令行语法是 "Committed"(已确定)。人可阅读的输出是 Uncommitted(未确定)。可解析的输出是 "Committed"(已确定)。

另请参见

rctladm(1M)、zonecfg(1M)、setrctl(2)、rctlblk_get_local_action(3C)、project(4)、attributes(5)、resource_controls (5)

附注

可在允许本地操作的资源控制块上设置的有效信号有 SIGABRT、SIGXRES、SIGHUP、SIGSTOP、SIGTERM 和 SIGKILL。此外,CPU 时间相关控制可发出 SIGXCPU 信号,文件大小相关控制可发送 SIGXFSZ 信号。