本章介绍用于管理系统进程的过程。
有关与管理系统进程相关的过程的信息,请参见以下主题:
有关管理系统进程的概述信息,请参见以下主题:
| 任务 | 说明 | 参考 | 
|---|---|---|
| 列出进程。 | 使用 ps 命令列出系统中的所有进程。 | |
| 显示有关进程的信息。 | 使用 pgrep 命令获取要显示其详细信息的进程的进程 ID。 | |
| 控制进程。 | 使用 pgrep 命令找到进程。然后,使用相应的 pcommand (/proc) 来控制进程。有关 (/proc) 命令的说明,请参见表 12–3。 | |
| 中止进程。 
 | 通过进程名称或进程 ID 找到进程。然后可以使用 pkill 或 kill 命令终止进程。 
 | 
下表介绍了用于管理系统进程的命令。
表 12–1 用于管理进程的命令| 命令 | 说明 | 手册页 | 
|---|---|---|
| ps、pgrep、prstat、pkill | 检查系统中活动进程的状态,并显示有关这些进程的详细信息。 | |
| pkill | 功能与 pgrep 相同,但通过名称或其他属性来查找进程或向进程发送信号,然后终止进程。像 kill 命令一样向每个匹配的进程发送信号,而不列显进程 ID。 | |
| pargs、preap | 协助进行进程调试。 | |
| dispadmin | 列出缺省进程调度策略。 | |
| priocntl | 为优先级类分配进程并管理进程优先级。 | |
| nice | 更改分时进程的优先级。 | |
| psrset | 将特定进程组绑定到一组处理器而非一个处理器。 | 
Solaris Management Console 的进程工具使您可通过用户友好的界面来管理进程。有关使用和启动 Solaris Management Console 的信息,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
使用 ps 命令可以检查系统中活动进程的状态,并可显示有关进程的技术信息。此数据对于管理任务(例如,确定设置进程优先级的方式)很有用。
进程的当前状态
进程 ID
父进程 ID
用户 ID
调度类
优先级
进程的地址
已用内存
已用 CPU 时间
下表介绍了 ps 命令报告的一些字段。具体显示哪些字段取决于您选择的选项。有关所有可用选项的说明,请参见 ps(1) 手册页。
表 12–2 ps 报告中字段的汇总| 字段 | 说明 | 
|---|---|
| UID | |
| PID | 进程 ID。 | 
| PPID | 父进程 ID。 | 
| C | 用于调度的处理器使用率。使用 -c 选项时,将不显示此字段。 | 
| CLS | 进程所属的调度类,例如实时、系统或分时。只有 -c 选项包括此字段。 | 
| PRI | 内核线程的调度优先级。数值越大,表示优先级越高。 | 
| NI | 进程的 nice 数值,该数值对其调度优先级有影响。进程的 nice 值越高,意味着其优先级越低。 | 
| ADDR | proc 结构的地址。 | 
| SZ | 进程的虚拟地址大小。 | 
| WCHAN | 进程休眠的事件或锁定的地址。 | 
| STIME | 以小时、分钟和秒表示的进程开始时间。 | 
| TTY | 从中启动进程或其父级的终端。问号表示没有控制终端。 | 
| TIME | 进程自开始以来使用的 CPU 时间总量。 | 
| CMD | 生成进程的命令。 | 
使用进程命令可以显示有关 /proc 目录中所列进程的详细信息。下表列出了 /proc 进程命令。/proc 目录也称为进程文件系统 (Process File System, PROCFS)。活动进程的映像按进程 ID 号存储在此位置。
表 12–3 进程命令 (/proc)| 进程命令 | 说明 | 
|---|---|
| pcred | 显示进程凭证信息 | 
| pfiles | 为进程中打开的文件报告 fstat 和 fcntl 信息 | 
| pflags | 列显 /proc 跟踪标志、暂挂信号和保留信号以及其他状态信息 | 
| pldd | 列出链接至进程中的动态库 | 
| pmap | 列显每个进程的地址空间图 | 
| psig | 列出每个进程的信号操作和处理程序 | 
| prun | 启动每个进程 | 
| pstack | 为每个进程中的每个 lwp 列显十六进制符号栈跟踪 | 
| pstop | 停止每个进程 | 
| ptime | 使用微状态记帐记录进程的时间 | 
| ptree | 显示包含该进程的进程树 | 
| pwait | 在进程终止后显示状态信息 | 
| pwdx | 显示进程的当前工作目录 | 
有关更多信息,请参见 proc(1)。
进程工具与 ps 命令的某些选项相似,区别在于这些命令提供的输出更详细。
通常,进程命令可执行以下操作:
通过使用一些进程命令,可以显示有关进程的详细技术信息或者控制活动进程。表 12–3 列出了一些 /proc 命令。
如果某个进程陷入无限循环或者执行时间过长,则可能需要停止(中止)该进程。有关使用 kill 或 pkill 命令停止进程的更多信息,请参见第 12 章。
/proc 文件系统是一个目录分层结构,其中包括状态信息和控制功能的附加子目录。
/proc 文件系统还提供了 xwatchpoint功能,用于重新映射在进程地址空间各页中的读写权限。该工具没有限制,并且是 MT-safe(多线程安全)的。
为了使用 /proc 的 xwatchpoint 功能,已修改调试工具,这意味着整个 xwatchpoint 进程会更快。
使用 dbx 调试工具设置 xwatchpoint 时,已删除以下限制:
由于基于 SPARC 的系统注册窗口而在栈的本地变量中设置 xwatchpoint。
在多线程进程中设置 xwatchpoint。
有关更多信息,请参见 proc(4) 和 mdb(1) 手册页。
 如何列出进程
如何列出进程以下示例显示 ps 命令在不带任何选项时的输出。
| $ ps PID TTY TIME COMD 1664 pts/4 0:06 csh 2081 pts/4 0:00 ps | 
以下示例显示 ps -ef 命令的输出。此输出显示,系统启动时最先执行的进程是 sched(交换程序),然后是 init 进程、pageout 等。
| $ ps -ef
     UID   PID  PPID  C    STIME TTY      TIME CMD
    root     0     0  0   Dec 20 ?        0:17 sched
    root     1     0  0   Dec 20 ?        0:00 /etc/init -
    root     2     0  0   Dec 20 ?        0:00 pageout
    root     3     0  0   Dec 20 ?        4:20 fsflush
    root   374   367  0   Dec 20 ?        0:00 /usr/lib/saf/ttymon
    root   367     1  0   Dec 20 ?        0:00 /usr/lib/saf/sac -t 300
    root   126     1  0   Dec 20 ?        0:00 /usr/sbin/rpcbind
    root    54     1  0   Dec 20 ?        0:00 /usr/lib/sysevent/syseventd
    root    59     1  0   Dec 20 ?        0:00 /usr/lib/picl/picld
    root   178     1  0   Dec 20 ?        0:03 /usr/lib/autofs/automountd
    root   129     1  0   Dec 20 ?        0:00 /usr/sbin/keyserv
    root   213     1  0   Dec 20 ?        0:00 /usr/lib/lpsched
    root   154     1  0   Dec 20 ?        0:00 /usr/sbin/inetd -s
    root   139     1  0   Dec 20 ?        0:00 /usr/lib/netsvc/yp/ypbind ...
    root   191     1  0   Dec 20 ?        0:00 /usr/sbin/syslogd
    root   208     1  0   Dec 20 ?        0:02 /usr/sbin/nscd
    root   193     1  0   Dec 20 ?        0:00 /usr/sbin/cron
    root   174     1  0   Dec 20 ?        0:00 /usr/lib/nfs/lockd
  daemon   175     1  0   Dec 20 ?        0:00 /usr/lib/nfs/statd
    root   376     1  0   Dec 20 ?        0:00 /usr/lib/ssh/sshd
    root   226     1  0   Dec 20 ?        0:00 /usr/lib/power/powerd
    root   315     1  0   Dec 20 ?        0:00 /usr/lib/nfs/mountd
    root   237     1  0   Dec 20 ?        0:00 /usr/lib/utmpd
    .
    .
    .     | 
 如何显示有关进程的信息
如何显示有关进程的信息获得要显示更多信息的进程的进程 ID。
| # pgrep process | 
其中,process 是要显示更多信息的进程的名称。
进程 ID 显示在输出的第一列中。
显示所需进程信息。
| # /usr/bin/pcommand pid | 
是要运行的 (/proc) 命令。表 12–3 列出并介绍了这些命令。
标识进程 ID。
以下示例显示如何使用进程命令来显示有关 cron 进程的更多信息。
| # pgrep cron 1
4780
# pwdx 4780 2
4780:   /var/spool/cron/atjobs
# ptree 4780 3
4780  /usr/sbin/cron
# pfiles 4780 4
4780:   /usr/sbin/cron
  Current rlimit: 256 file descriptors
   0: S_IFCHR mode:0666 dev:290,0 ino:6815752 uid:0 gid:3 rdev:13,2
      O_RDONLY|O_LARGEFILE
      /devices/pseudo/mm@0:null
   1: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /var/cron/log
   2: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /var/cron/log
   3: S_IFIFO mode:0600 dev:32,128 ino:42049 uid:0 gid:0 size:0
      O_RDWR|O_LARGEFILE
      /etc/cron.d/FIFO
   4: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK
   5: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
      O_RDWR | 
获得 cron 进程的进程 ID
显示 cron 进程的当前工作目录
显示包含 cron 进程的进程树
显示 fstat 和 fcntl 信息
 如何控制进程
如何控制进程获得要控制的进程的进程 ID。
| # pgrep process | 
其中,process 是要控制的进程的名称。
进程 ID 显示在输出的第一列中。
使用相应的进程命令来控制进程。
| # /usr/bin/pcommand pid | 
是要运行的进程 (/proc) 命令。表 12–3 列出并介绍了这些命令。
标识进程 ID。
验证进程状态。
| # ps -ef | grep pid | 
以下示例显示如何使用进程命令来停止和重新启动 dtpad 进程。
| # pgrep dtpad 1 2921 # pstop 29212 # prun 2921 3 | 
获得 dtpad 进程的进程 ID
停止 dtpad 进程
重新启动 dtpad 进程
有时,您可能需要停止(中止)进程。该进程可能处于无限循环中。或者,您可能启动了一个大型作业,并且希望在完成之前使其停止。您可以中止属于您的任何进程。超级用户可以中止系统中的任何进程,但进程 ID 为 0、1、2、3 和 4 的进程除外。中止这些进程很可能会使系统崩溃。
有关更多信息,请参见 pgrep(1)、pkill(1) 和 kill(1) 手册页。
 如何终止进程 (pkill)
如何终止进程 (pkill)(可选的)要终止另一个用户的进程,请成为超级用户或同等角色。
获得要终止的进程的进程 ID。
| $ pgrep process | 
其中,process 是要终止的进程的名称。
例如:
| $ pgrep netscape 587 566 | 
在输出中显示进程 ID。
要获得有关 Sun Ray 的进程信息,请使用以下命令:
| # ps -fu user | 
此命令将列出所有用户进程。
| # ps -fu user | grep process | 
此命令可为用户找到特定进程。
终止进程。
| $ pkill [signal] process | 
当 pkill 命令行语法中不包含任何信号时,使用的缺省信号为 –15 (SIGKILL)。将 –9 信号 (SIGTERM) 与 pkill 命令一起使用,可以确保进程快速终止。但是,不应使用 –9 信号来中止特定进程,例如数据库进程或 LDAP 服务器进程。结果是可能丢失数据。
是要停止的进程的名称。
使用 pkill 命令终止进程时,先尝试使用该命令本身,而不包括信号选项。等待几分钟确定进程是否终止,然后再使用带有 -9 信号的 pkill 命令。
验证进程是否已终止。
| $ pgrep process | 
pgrep 命令的输出中应不再列出已终止的进程。
 如何终止进程 (kill)
如何终止进程 (kill)(可选的)要终止另一个用户的进程,请成为超级用户或同等角色。
获得要终止的进程的进程 ID。
| $ ps -fu user | 
其中,user 是要为其显示进程的用户。
进程 ID 显示在输出的第一列中。
终止进程。
| $ kill [signal-number] pid | 
当 kill 命令行语法中不包括任何信号时,使用的缺省信号为 –15 (SIGKILL)。将 –9 信号 (SIGTERM) 与 kill 命令一起使用,可以确保进程快速终止。但是,不应使用 –9 信号来中止特定进程,例如数据库进程或 LDAP 服务器进程。结果是可能丢失数据。
是要终止的进程的进程 ID。
使用 kill 命令停止进程时,先尝试使用该命令本身,而不包括信号选项。等待几分钟以确定进程是否终止,然后再使用带有 -9 信号的 kill 命令。
验证进程是否已终止。
| $ pgrep pid | 
pgrep 命令的输出中应不再列出已终止的进程。
pargs 命令和 preap 命令可以改进进程调试。pargs 命令可以列显与实时进程或核心转储文件关联的参数和环境变量。preap 命令可以删除不再存在(僵停)的进程。僵停进程尚不具有由父进程请求的退出状态。这些进程通常是无害的,但如果数量众多,则会占用系统资源。可以使用 pargs 和 preap 命令检查您有权检查的任何进程。作为超级用户,您可以检查任何进程。
有关使用 preap 命令的信息,请参见 preap(1) 手册页。有关使用 pargs 命令的信息,请参见 pargs(1) 手册页。另请参见 proc(1) 手册页。
pargs 命令可以解决一个长期存在的问题,即使用 ps 命令无法显示传递给进程的所有参数。以下示例显示如何通过结合使用 pargs 命令和 pgrep 命令来显示传递给进程的参数。
| # pargs `pgrep ttymon` 579: /usr/lib/saf/ttymon -g -h -p system-name console login: -T sun -d /dev/console -l argv[0]: /usr/lib/saf/ttymon argv[1]: -g argv[2]: -h argv[3]: -p argv[4]: system-name console login: argv[5]: -T argv[6]: sun argv[7]: -d argv[8]: /dev/console argv[9]: -l argv[10]: console argv[11]: -m argv[12]: ldterm,ttcompat 548: /usr/lib/saf/ttymon argv[0]: /usr/lib/saf/ttymon | 
以下示例显示如何使用 pargs -e 命令来显示与某一进程关联的环境变量。
| $ pargs -e 6763 6763: tcsh envp[0]: DISPLAY=:0.0 | 
| 任务 | 说明 | 参考 | 
|---|---|---|
| 显示有关进程类的基本信息。 | 使用 priocntl -l 命令可以显示进程调度类和优先级范围。 | |
| 显示进程的全局优先级。 | 使用 ps -ecl 命令可以显示进程的全局优先级。 | |
| 指定进程优先级。 | 使用 priocntl - e -c 命令以指定的优先级启动进程。 | |
| 更改分时进程的调度参数。 | 使用 priocntl -s -m 命令可以更改分时进程中的调度参数。 | |
| 更改进程的类。 | 使用 priocntl -s -c 命令可以更改进程的类。 | |
| 更改进程的优先级。 | 使用 /usr/bin/nice 命令及相应选项可以降低或提高进程的优先级。 | 
以下列表列出了可在系统中配置的进程调度类。其中还包括分时类的用户优先级范围。
可能的进程调度类如下所示:
进程的调度优先级是进程调度程序根据调度策略分配的优先级。dispadmin 命令可以列出缺省调度策略。有关更多信息,请参见 dispadmin(1M) 手册页。
可以使用 priocntl 命令将进程指定给优先级类并管理进程优先级。有关使用 priocntl 命令管理进程的说明,请参见如何指定进程优先级 (priocntl)。
 如何显示有关进程类的基本信息 (priocntl)
如何显示有关进程类的基本信息 (priocntl)| # priocntl -l
CONFIGURED CLASSES
==================
SYS (System Class)
TS (Time Sharing)
        Configured TS User Priority Range: -60 through 60
FX (Fixed priority)
        Configured FX User Priority Range: 0 through 60
IA (Interactive)
        Configured IA User Priority Range: -60 through 60 | 
 如何显示进程的全局优先级
如何显示进程的全局优先级以下示例显示 ps -ecl 命令的输出。PRI 列中的值显示,pageout 进程优先级最高,而 sh 进程的优先级最低。
| $ ps -ecl F S UID PID PPID CLS PRI ADDR SZ WCHAN TTY TIME COMD 19 T 0 0 0 SYS 96 f00d05a8 0 ? 0:03 sched 8 S 0 1 0 TS 50 ff0f4678 185 ff0f4848 ? 36:51 init 19 S 0 2 0 SYS 98 ff0f4018 0 f00c645c ? 0:01 pageout 19 S 0 3 0 SYS 60 ff0f5998 0 f00d0c68 ? 241:01 fsflush 8 S 0 269 1 TS 58 ff0f5338 303 ff49837e ? 0:07 sac 8 S 0 204 1 TS 43 ff2f6008 50 ff2f606e console 0:02 sh | 
 如何指定进程优先级 (priocntl)
如何指定进程优先级 (priocntl)成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
以指定的优先级启动进程。
| # priocntl -e -c class -m user-limit -p pri command-name | 
执行该命令。
指定要在其中运行进程的类。有效类包括 TS(分时)、RT(实时)、IA(交互)、FSS(公平份额)和 FX(固定优先级)。
使用 -p 选项时,可以指定可将优先级提高或降低的最大量。
允许您为实时线程指定在 RT 类中的相对优先级。对于分时进程而言,使用 -p 选项可以指定用户提供的优先级,该优先级范围是 -60 到 +60。
验证进程状态。
| # ps -ecl | grep command-name | 
以下示例显示如何以用户提供的最高优先级启动 find 命令。
| # priocntl -e -c TS -m 60 -p 60 find . -name core -print # ps -ecl | grep find | 
 如何更改分时进程的调度参数 (priocntl)
如何更改分时进程的调度参数 (priocntl)成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
| # priocntl -s -m user-limit [-p user-priority] -i idtype idlist | 
允许设置用户优先级范围的上限并更改当前优先级。
使用 -p 选项时,可以指定可将优先级提高或降低的最大量。
允许指定优先级。
结合使用 xidtype 和 xidlist 以标识一个或多个进程。xidtype 指定 ID 的类型,例如进程 ID 或用户 ID。使用 xidlist 可以标识进程 ID 或用户 ID 的列表。
验证进程状态。
| # ps -ecl | grep idlist | 
以下示例显示如何以 500 毫秒的时间片、RT 类中的优先级 20 以及全局优先级 120 来执行命令。
| # priocntl -e -c RT -m 500 -p 20 myprog # ps -ecl | grep myprog | 
 如何更改进程的类 (priocntl)
如何更改进程的类 (priocntl)更改进程的类。
| # priocntl -s -c class -i idtype idlist | 
允许设置用户优先级范围的上限并更改当前优先级。
为分时或实时指定要更改进程的类 TS 或 RT。
结合使用 xidtype 和 xidlist 以标识一个或多个进程。xidtype 指定 ID 的类型,例如进程 ID 或用户 ID。使用 xidlist 可以标识进程 ID 或用户 ID 的列表。
只有超级用户或在实时 Shell 中工作的用户才能将某一进程更改为实时进程或将实时进程更改为该进程。如果超级用户将用户进程更改为实时类,那么该用户以后不能使用 priocntl -s 命令来更改实时调度参数。
验证进程状态。
| # ps -ecl | grep idlist | 
以下示例显示如何将属于用户 15249 的所有进程都更改为实时进程。
| # priocntl -s -c RT -i uid 15249 # ps -ecl | grep 15249 | 
支持 nice 命令的目的只是为了向下兼容以前的 Solaris 发行版。priocntl 命令在管理进程方面提供了更多的灵活性。
进程的优先级由其调度类的策略和 nice 数值决定。每个分时进程都有全局优先级。全局优先级的计算方法是用户提供的优先级(该优先级可能受 nice 或 priocntl 命令影响)加上系统计算的优先级。
进程的执行优先级数由操作系统分配。优先级数由多个因素决定,其中包括进程的调度类、进程使用的 CPU 时间以及进程的 nice 数值(对于分时进程的情况)。
每个分时进程都以缺省 nice 数值启动,它从父进程中继承该数值。nice 数值显示在 ps 报告的 NI 列中。
用户可通过提高用户提供的优先级来降低进程的优先级。但是,只有超级用户能够通过降低 nice 数值来提高进程的优先级。此限制使用户无法提高自己所拥有进程的优先级,因此会独占更大的 CPU 份额。
nice 数值的范围是从 0 到 +39,其中 0 表示最高优先级。每个分时进程的缺省 nice 值为 20。有两个可用的命令版本:标准版本 /usr/bin/nice 以及 C shell 内置命令。
 如何更改进程的优先级 (nice)
如何更改进程的优先级 (nice)通过使用此过程,用户可以降低进程的优先级。而超级用户可以提高或降低进程的优先级。
本节介绍的是 /usr/bin/nice 命令而非 C-shell 内置 nice 命令的语法。有关 C-shell nice 命令的信息,请参见 csh(1) 手册页。
确定要以用户身份还是超级用户身份更改进程的优先级。然后,选择以下两项之一:
以用户身份,通过增大 nice 数值降低命令的优先级。
以下 nice 命令使 nice 数值增大 5 个单位,从而以更低的优先级执行 command-name。
| $ /usr/bin/nice -5 command-name | 
在前面的命令中,减号指定后面的内容是一个选项。也可以通过以下方式来指定此命令:
| % /usr/bin/nice -n 5 command-name | 
以下 nice 命令使 nice 数值增大 10 个单位(缺省增量)但未超出最大值 39,从而降低了 command-name 的优先级。
| % /usr/bin/nice command-name | 
作为超级用户或同等角色,通过更改 nice 数值来提高或降低命令的优先级。
以下 nice 命令使 nice 数值降低 10 个单位但不低于最小值 0,从而提高了 command-name 的优先级。
| # /usr/bin/nice --10 command-name | 
在前面的命令中,第一个减号指定后面的内容是一个选项。第二个减号指示一个负数。
以下 nice 命令使 nice 数值增大 5 个单位但未超出最大值 39,从而降低了 command-name 的优先级。
| # /usr/bin/nice -5 command-name | 
有关更多信息,请参见 nice(1) 手册页。