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)。它允许访问基本限制和特权限制以及当前在指定实体上使用的限制。
有两种操作模式。首先是 get 操作,该操作列显目标 rctl 的 rctl 值。如果未给定 –d、–e、–o、–s、–r、–v 或 –x 选项,该操作将运行。如果 –t 选项给定了特权,则仅列显与特权匹配的 rctl 值。否则列显任何特权的 rctl 值。
有关当前发行版的 Solaris 操作系统中支持的资源控制的说明,请参见 resource-controls(7)。
如果 –n 选项给定了名称,则仅列显由 name 指向的 rctl 的 rctl 值。否则,将列显目标实体以及目标实体所属的实体的所有 rctl。例如,如果将 prctl 调用到任务而不给定名称,则将列显该目标任务的所有 rctl 值,以及该目标任务的项目和区域的 rctl 值。
对于包含要列显的 rctl 值的 rctl,如果其用法存在,还会列显用法。如果 rctl 中有多个 rctl 值,则按升序列显这些值。此外,通过指定 –P 选项,调用方可获得计算机可解析的输出。获取操作的可接受的选项列表是 –i、–n、–t 和 –P。
操作的第二种类型是修改操作。在修改操作中,必须由 –n 选项显式指定 name 或 rctl。修改操作可分为以下几个部分:
插入操作:插入具有给定值和特权的新 rctl 值。如果操作修改或接收方 pid 已给定并且是有效的,则它们将应用于插入的 rctl 值。必须显式给定值,如果未显式给定特权,则假定为基本特权。可使用三种方法调用插入操作:
指定 –s 选项。
未给定 –d、–e、–o、–s、–r、–x 选项,但给定了 –v 选项。这实际上与调用同一命令再加上 –s 选项是相同的。
由于没有匹配项,并显式给定了 –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 选项显式指定它。如果调用方未给定接收方 pid,而所生成的 rctl 值有接收方 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 中,则 prctl 将失败,因为 rctl 中不能有重复的 rctl 值。
搜索匹配的 rctl 值失败,除了操作修改操作中提到的情况以外,该操作尝试插入新 rctl 值。
请求的 rctl 值修改超出了调用方的特权。有关更多信息,请参见 setrctl(2) 手册页。
有关当前发行版的 Oracle Solaris 操作系统中支持的资源控制的说明,请参见 resource-controls(7)。
如果未指定 –s、–r、–x、–v、–d 或 –e 选项中的任何一个,则调用被视为获取操作。否则,它被视为修改操作。
支持以下选项:
在 rctl 值上禁用 (–d) 或启用 (–e) 指定的操作。
操作:
此操作仅适用于 –d。它将禁用所有操作。对于具有 deny 全局标志的资源控制值,此操作将失败。
表示资源控制尝试拒绝向所请求的资源超出了资源控制值的请求上的进程、任务、项目或区域授予资源。如果资源控制具有 no-deny 全局标志,则无法启用 deny 操作。如果资源控制具有 deny 全局标志,则无法禁用 deny 操作。
此操作仅适用于 –d。它将停用任何 signal 操作。
启用或禁用特定信号操作。signum 是信号编号或信号的字符串表示形式,它会省略 "SIG" 前缀且字符串不区分大小写,即,"TERm" 识别为 SIGTERM。对具有 no-local-action 全局标志的资源控制设置 signal 操作会失败。rctl 值上可以设置的有效信号包括 SIGABRT、SIGXRES、SIGHUP、SIGSTOP、SIGTERM 和 SIGKILL。此外,CPU 时间相关控制可发出 SIGXCPU 信号,文件大小相关控制可发送 SIGXFSZ 信号。
在 signal=signum 操作中,signum 是一个信号编号(或信号的字符串表示形式)。对具有 no-local-action 全局标志的资源控制设置 signal 操作会失败。可以发送一组有限的信号。有关其他详细信息,请参见“附注”部分。
指定 id 操作数的类型。有效的 idtype 为 process、task、project 或 zone。还可以为 pid、taskid、projid 和 zoneid。如果省略了 –i 选项,则缺省 id 类型为 process。
指定要获取或修改的资源控制的名称。名称必须引用实体的 rctl,它应属于由 –i 选项给定的目标实体。例如,在传递 –n 选项时,任务 (–i taskid) 的项目 rctl 是允许的,但反之则不然。
根据需要指定被插入或被修改的 rctl 值的接收方 pid。如果不允许使用基本特权,或显式给定了除基本特权以外的特权,则不允许使用该选项。
以空格分隔格式显示资源控制值。仅允许用于获取操作。
调用替换操作。
调用插入操作。
指定要获取或修改的资源控制类型。允许值 priv 而不是 privileged。
为修改操作指定资源控制值。
有关设置资源控制值时可用于表示大值的单位修饰符和比例因子的说明,请参见 resource-controls(7)。
调用删除操作。
支持下列操作数:
要查询的实体(process、task、project 或 zone)的 ID。对于 project 和 zone,还将识别实体名称而不是数字 ID。如果未指定 id,则将返回一条错误消息。
以下示例显示当前 shell 所属任务的当前资源控制设置:
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 找出当前 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(7))设置和修改项目的 CPU 上限。(可在 /etc/project 文件中使用相同的资源控制。请参见 project(5))。以下命令将修改 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(7))设置和修改区域的 CPU 上限。(可使用 zonecfg(8) 命令操控相同的资源控制。)以下命令将修改 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(7):
|
命令行语法是 "Committed"(已确定)。人可阅读的输出是 Uncommitted(未确定)。可解析的输出是 "Committed"(已确定)。
setrctl(2)、rctlblk_get_local_action(3C)、project(5)、attributes(7)、resource-controls(7)、rctladm(8)、zonecfg(8)