系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones

第 3 章 管理项目和任务

本章介绍如何使用 Solaris 资源管理中的项目和任务功能。

本章包含以下主题:

有关项目和任务功能的概述,请参见第 2 章


注 –

如果在安装了区域的 Solaris 系统上使用这些功能,则当这些功能命令在非全局区域 (non-global zone) 中运行时,只有同一区域中的进程才能通过使用进程 ID 的系统调用界面进行查看。


管理项目和任务(任务图)

任务 

说明 

参考 

查看用于项目与任务的命令和选项的示例。 

显示任务和项目 ID,显示系统上当前所运行进程和项目的各种统计信息。 

命令和命令选项示例

定义项目。 

/etc/project 文件中添加项目条目并修改此条目的值。

如何定义项目和查看当前项目

删除项目。 

/etc/project 文件中删除项目条目。

如何从 /etc/project 文件中删除项目

验证 project 文件或项目数据库。

检查 /etc/project 文件的语法或根据外部命名服务验证项目名称和项目 ID 的唯一性。

如何验证 /etc/project 文件的内容

获取项目成员身份信息。 

显示发出调用的进程的当前项目成员身份。 

如何获取项目成员身份信息

创建新任务。 

使用 newtask 命令在特定项目中创建一项新任务。

如何创建新任务

将正在运行的进程与不同的任务和项目进行关联。 

将进程号与特定项目中的新任务 ID 进行关联。 

如何将正在运行的进程移至新任务

添加并使用项目属性。 

使用项目数据库管理命令添加、编辑、验证和删除项目属性。 

编辑和验证项目属性

命令和命令选项示例

本节提供用于项目与任务的命令和选项的示例。

用于项目和任务的命令选项

ps 命令

使用带有 -o 选项的 ps 命令可显示任务和项目 ID。例如,要查看项目 ID,请键入以下内容:


# ps -o user,pid,uid,projid
USER PID   UID  PROJID
jtd  89430 124  4113

id 命令

使用带有 -p 选项的 id 命令可列显当前的项目 ID,以及用户和组 ID。如果提供了 user 操作数,则还会列显与该用户的正常登录相关联的项目:


#  id -p
uid=124(jtd) gid=10(staff) projid=4113(booksite)

pgreppkill 命令

要仅将进程与特定列表中的项目 ID 进行匹配,请使用带有 -J 选项的 pgreppkill 命令:


# pgrep -J projidlist
# pkill -J projidlist

要仅将进程与特定列表中的任务 ID 进行匹配,请使用带有 -T 选项的 pgreppkill 命令:


# pgrep -T taskidlist
# pkill -T taskidlist

prstat 命令

要显示系统上当前运行的进程和项目的各种统计信息,请使用带有 -J 选项的 prstat 命令:


% prstat -J
	  PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 21634 jtd      5512K 4848K cpu0    44    0   0:00.00 0.3% prstat/1
   324 root       29M   75M sleep   59    0   0:08.27 0.2% Xsun/1
 15497 jtd        48M   41M sleep   49    0   0:08.26 0.1% adeptedit/1
   328 root     2856K 2600K sleep   58    0   0:00.00 0.0% mibiisa/11
  1979 jtd      1568K 1352K sleep   49    0   0:00.00 0.0% csh/1
  1977 jtd      7256K 5512K sleep   49    0   0:00.00 0.0% dtterm/1
   192 root     3680K 2856K sleep   58    0   0:00.36 0.0% automountd/5
  1845 jtd        24M   22M sleep   49    0   0:00.29 0.0% dtmail/11
  1009 jtd      9864K 8384K sleep   49    0   0:00.59 0.0% dtwm/8
   114 root     1640K  704K sleep   58    0   0:01.16 0.0% in.routed/1
   180 daemon   2704K 1944K sleep   58    0   0:00.00 0.0% statd/4
   145 root     2120K 1520K sleep   58    0   0:00.00 0.0% ypbind/1
   181 root     1864K 1336K sleep   51    0   0:00.00 0.0% lockd/1
   173 root     2584K 2136K sleep   58    0   0:00.00 0.0% inetd/1
   135 root     2960K 1424K sleep    0    0   0:00.00 0.0% keyserv/4
PROJID    NPROC  SIZE   RSS MEMORY      TIME  CPU PROJECT
    10       52  400M  271M    68%   0:11.45 0.4% booksite
     0       35  113M  129M    32%   0:10.46 0.2% system

Total: 87 processes, 205 lwps, load averages: 0.05, 0.02, 0.02

要显示系统上当前运行的进程和任务的各种统计信息,请使用带有 -T 选项的 prstat 命令:


% prstat -T
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 23023 root       26M   20M sleep   59    0   0:03:18 0.6% Xsun/1
 23476 jtd        51M   45M sleep   49    0   0:04:31 0.5% adeptedit/1
 23432 jtd      6928K 5064K sleep   59    0   0:00:00 0.1% dtterm/1
 28959 jtd        26M   18M sleep   49    0   0:00:18 0.0% .netscape.bin/1
 23116 jtd      9232K 8104K sleep   59    0   0:00:27 0.0% dtwm/5
 29010 jtd      5144K 4664K cpu0    59    0   0:00:00 0.0% prstat/1
   200 root     3096K 1024K sleep   59    0   0:00:00 0.0% lpsched/1
   161 root     2120K 1600K sleep   59    0   0:00:00 0.0% lockd/2
   170 root     5888K 4248K sleep   59    0   0:03:10 0.0% automountd/3
   132 root     2120K 1408K sleep   59    0   0:00:00 0.0% ypbind/1
   162 daemon   2504K 1936K sleep   59    0   0:00:00 0.0% statd/2
   146 root     2560K 2008K sleep   59    0   0:00:00 0.0% inetd/1
   122 root     2336K 1264K sleep   59    0   0:00:00 0.0% keyserv/2
   119 root     2336K 1496K sleep   59    0   0:00:02 0.0% rpcbind/1
   104 root     1664K  672K sleep   59    0   0:00:03 0.0% in.rdisc/1
TASKID    NPROC  SIZE   RSS MEMORY      TIME  CPU PROJECT                     
   222       30  229M  161M    44%   0:05:54 0.6% group.staff                 
   223        1   26M   20M   5.3%   0:03:18 0.6% group.staff                 
    12        1   61M   33M   8.9%   0:00:31 0.0% group.staff                 
     1       33   85M   53M    14%   0:03:33 0.0% system                      

Total: 65 processes, 154 lwps, load averages: 0.04, 0.05, 0.06	

注 –

-J-T 选项不能一起使用。


cronsu 用于项目和任务

cron 命令

cron 命令将发出 settaskid,以确保每个 cronatbatch 作业都是在单独的任务中执行,并对提交用户使用了适当的缺省项目。atbatch 命令也会捕获当前项目 ID,以确保在运行 at 作业时恢复项目 ID。

su 命令

作为模拟登录的一部分,su 命令将通过创建新任务加入目标用户的缺省项目。

要使用 su 命令切换用户的缺省项目,请键入以下内容:


# su user

管理项目

Procedure如何定义项目和查看当前项目

此示例说明如何使用 projadd 命令添加项目条目,以及如何使用 projmod 命令修改此条目。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 projects -l 查看系统上缺省的 /etc/project 文件。


    # projects -l
    system:0::::
    user.root:1::::
    noproject:2::::
    default:3::::
    group.staff:10::::system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
  3. 添加名为 booksite 的项目。将该项目指定给名为 mark 的用户,同时指定项目 ID 号 4113


    # projadd -U mark -p 4113 booksite
    
  4. 再次查看 /etc/project 文件。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    booksite
            projid : 4113
            comment: ""
            users  : mark
            groups : (none)
            attribs: 
  5. 在注释字段中添加描述项目的注释。


    # projmod -c `Book Auction Project' booksite
    
  6. 查看 /etc/project 文件中的更改。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    booksite
            projid : 4113
            comment: "Book Auction Project"
            users  : mark
            groups : (none)
            attribs: 
另请参见

要将项目、任务和进程绑定到池,请参见设置池属性并绑定到池

Procedure如何从 /etc/project 文件中删除项目

此示例显示如何使用 projdel 命令删除项目。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 projdel 命令删除 booksite 项目。


    # projdel booksite
    
  3. 显示 /etc/project 文件。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
  4. 以用户 mark 的身份登录并键入 projects 来查看指定给此用户的项目。


    # su - mark
    # projects
    default

如何验证 /etc/project 文件的内容

如果没有给出编辑选项,projmod 命令便会验证 project 文件的内容。

要验证 NIS 映射,请以超级用户的身份登录,并键入以下内容:


# ypcat project | projmod -f —

注 –

ypcat project | projmod -f — 命令尚未实现。


要检查 /etc/project 文件的语法,请键入以下内容:


# projmod -n

如何获取项目成员身份信息

使用带有 -p 标志的 id 命令显示发出调用的进程的当前项目成员身份。


$ id -p
uid=100(mark) gid=1(other) projid=3(default)

Procedure如何创建新任务

  1. 以目标项目 booksite 的成员身份登录。

  2. 使用带有 -v(详细)选项的 newtask 命令在 booksite 项目中创建新任务,以获取系统任务 ID。


    machine% newtask -v -p booksite
    16

    通过执行 newtask,可以在指定项目中创建新任务并将用户的缺省 shell 置于此任务中。

  3. 查看发出调用的进程的当前项目成员身份。


    machine% id -p
    uid=100(mark) gid=1(other) projid=4113(booksite)

    现在该进程成为新项目的成员。

Procedure如何将正在运行的进程移至新任务

此示例显示如何将正在运行的进程与不同的任务和新项目进行关联。要执行此操作,您必须是超级用户,或者是进程属主并且是新项目的成员。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”


    注 –

    如果您是进程属主或新项目成员,则可以跳过此步骤。


  2. 获取 book_catalog 进程的进程 ID。


    # pgrep book_catalog
    	8100
  3. 将进程 8100booksite 项目中的新任务 ID 进行关联。


    # newtask -v -p booksite -c 8100
    	17

    -c 选项指定 newtask 作用于现有的命名进程。

  4. 确认任务到进程 ID 的映射。


    # pgrep -T 17
    	8100

编辑和验证项目属性

您可以使用 projaddprojmod 项目数据库管理命令来编辑项目属性。

-K 选项指定属性替换列表。属性由分号 (;) 进行分隔。如果将 -K 选项和 -a 选项一起使用,则会添加属性或属性值。如果将 -K 选项和 -r 选项一起使用,则会删除属性或属性值。如果将 -K 选项与 -s 选项一起使用,则会替换属性或属性值。

Procedure如何将属性和属性值添加到项目

可以使用带有 -a-K 选项的 projmod 命令将值添加到项目属性中。如果属性不存在,则会创建一个。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 在项目 myproject 中添加无属性值的资源控制属性 task.max-lwps。加入项目的任务只有系统属性值。


    # projmod -a -K task.max-lwps myproject
    
  3. 然后可以为 myproject 项目中的 task.max-lwps 添加值。此值包含权限级别、阈值以及与达到阈值关联的操作。


    # projmod -a -K "task.max-lwps=(priv,100,deny)" myproject
    
  4. 由于资源控制属性可以具有多个值,因此可以使用同一个选项将其他值添加到现有的值列表中。


    # projmod -a -K "task.max-lwps=(priv,1000,signal=KILL)" myproject
    

    用逗号分隔多个值。现在 task.max-lwps 条目应为:


    task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)

Procedure如何从项目中删除属性值

此过程假设具有以下值:


task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)
  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 要删除 myproject 项目中 task.max-lwps 资源控制的属性值,请使用带有 -r-K 选项的 projmod 命令。


    # projmod -r -K "task.max-lwps=(priv,100,deny)" myproject
    

    如果 task.max-lwps 具有多个值,例如:


    task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)

    则会删除第一个匹配的值。结果将为:


    task.max-lwps=(priv,1000,signal=KILL)

Procedure如何从项目中删除资源控制属性

要删除 myproject 项目中的 task.max-lwps 资源控制属性,请使用带有 -r-K 选项的 projmod 命令。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 从项目 myproject 中删除属性 task.max-lwps 及其所有值:


    # projmod -r -K task.max-lwps myproject
    

Procedure如何替换项目的属性和属性值

要替换项目 myproject 中属性 task.max-lwps 的值,请使用带有 -s-K 选项的 projmod 命令。如果属性不存在,则会创建一个。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用所示的新值替换当前的 task.max-lwps 值:


    # projmod -s -K "task.max-lwps=(priv,100,none),(priv,120,deny)" myproject
    

    结果为:


    task.max-lwps=(priv,100,none),(priv,120,deny)

Procedure如何删除资源控制属性的现有值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 要从项目 myproject 中删除 task.max-lwps 的当前值,请键入:


    # projmod -s -K task.max-lwps myproject