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 选项中的任何一个,则调用被视为获取操作。否则,它被视为修改操作。
支持以下选项:
对 –v、–t 和 –p 指定的资源控制值禁用 (–d) 或启用 (–e) 指定的 action。如果未指定 –v、–t 或 –p 选项中的任何一个,则它们与任何值、特权或接收者 pid 都匹配。例如,仅指定 –v 将修改具有匹配的值且与任意特权和接收者 pid 匹配的第一个资源控制。如果未找到匹配的资源控制值,则按指定了 –s 时的方式添加新值。
操作:
此操作仅适用于 –d。它将禁用所有操作。对于具有 deny 全局标志的资源控制值,此操作将失败。
表示资源控制尝试拒绝向所请求的资源超出了资源控制值的请求上的进程、任务、项目或区域授予资源。如果资源控制具有 no-deny 全局标志,则无法启用 deny 操作。如果资源控制具有 deny 全局标志,则无法禁用 deny 操作。
此操作仅适用于 –d。它将停用 signal 操作。
在 signal=signum 操作中,signum 是一个信号编号(或信号的字符串表示形式)。对具有 no-local-action 全局标志的资源控制设置 signal 操作会失败。可以发送一组有限的信号。有关其他详细信息,请参见“附注”部分。
指定 id 操作数的类型。有效的 idtype 为 process、task、project 或 zone。还可以为 pid、taskid、projid 和 zoneid。如果省略了 –i 选项,则缺省 id 类型为 process。
对于修改操作,id 操作数归属的实体是目标实体。例如,在 –i process 上设置一个项目资源控制将会在每个给定进程参数归属的项目上设置该资源控制。
对于获取操作,将为 id 操作数归属的所有实体列出资源控制。例如,–i task taskid 将为任务以及该任务归属的项目和区域列出任务、项目和区域资源控制。
指定要获取或设置的资源控制的名称。如果未指定 name,将检索所有资源控制。
处理基本任务项目或区域资源控制值时(使用 –s、–r、–x、–d 或 –e),可使用 –p 指定接收者 pid。在任务、项目或区域上设置一个或多个新的基本资源控制时,如果 –i idtype 选项参数不是 process,则 –p 选项是必需的。
以空格分隔形式显示资源控制值。
使用通过 –v 选项指定的新值替换第一个资源控制值(与 –t privilege 相匹配的)。
设置一个新的资源控制值。
此选项需要 –v 选项。
如果未指定 –t 选项,则使用基本特权。如果要设置基本任务、进程或区域资源控制,则需要 –p。如果还指定了 –e 或 –d,则也将设置对新的资源控制的操作。
为了与早期版本兼容,如果指定了 –v 且未指定 –e、–d、–r 或 –x 中的任何一个,则会隐式包含此选项。
有关设置资源控制值时可用于表示大值的单位修饰符和比例因子的说明,请参见 resource_controls (5)。
指定要设置的资源控制类型。除非为资源控制设置了 "lowerable" 标志,否则只有其特权等效于 root 的用户(或 setuid 程序)执行的调用可修改特权资源控制。有关 RCTL_GLOBAL_LOWERABLE 标志的说明,请参见 rctlblk_set_value(3C)。如果未指定类型,则采用 basic。对于获取操作,如果未指定类型,则将显示所有资源控制类型的值,包括 system。
为设置操作指定资源控制值。如果未指定 value,则将在给定类型的具有最低值的资源控制上执行修改(删除、启用或禁用操作)。
有关设置资源控制值时可用于表示大值的单位修饰符和比例因子的说明,请参见 resource_controls (5)。
删除指定的资源控制值。如果未提供删除选项,则 prctl 的缺省操作是修改具有匹配的值和特权的资源控制值,或插入具有给定特权的新值。setrctl(2) 中更完整地讨论了匹配条件。
如果未指定 –d、–e、–v 或 –x 选项中的任何一个,则调用被认为是获取操作。
支持下列操作数:
要查询的实体(process、task、project 或 zone)的 ID。如果调用方用户的凭证没有特权,且正被查询的实体拥有不同的凭证,则操作将失败。如果未指定 id,则将返回一条错误消息。
以下示例显示当前 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
将返回以下退出值:
成功。
遇到致命错误。
指定的命令行选项无效。
进程信息和控制文件
有关下列属性的说明,请参见 attributes(5):
|
命令行语法是 "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 信号。