系统管理指南:高级管理

用于管理系统进程的命令

下表介绍了用于管理系统进程的命令。

表 12–1 用于管理进程的命令

命令  

说明 

手册页 

ps、pgrep、prstat、pkill

检查系统中活动进程的状态,并显示有关这些进程的详细信息。 

ps(1)、pgrep(1) 和 prstat(1M)

pkill

功能与 pgrep 相同,但通过名称或其他属性来查找进程或向进程发送信号,然后终止进程。像 kill 命令一样向每个匹配的进程发送信号,而不列显进程 ID。

pgrep(1) 和 pkill(1)

kill(1)

pargs、preap

协助进行进程调试。 

pargs(1) 和 preap(1)

dispadmin

列出缺省进程调度策略。 

dispadmin(1M)

priocntl

为优先级类分配进程并管理进程优先级。 

priocntl(1)

nice

更改分时进程的优先级。 

nice(1)

psrset

将特定进程组绑定到一组处理器而非一个处理器。 

psrset(1M)

Solaris Management Console 的进程工具使您可通过用户友好的界面来管理进程。有关使用和启动 Solaris Management Console 的信息,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”。

使用 ps 命令

使用 ps 命令可以检查系统中活动进程的状态,并可显示有关进程的技术信息。此数据对于管理任务(例如,确定设置进程优先级的方式)很有用。

根据您所使用的选项,ps 命令会报告以下信息:

下表介绍了 ps 命令报告的一些字段。具体显示哪些字段取决于您选择的选项。有关所有可用选项的说明,请参见 ps(1) 手册页。

表 12–2 ps 报告中字段的汇总

字段 

说明 

UID

进程属主的有效用户 ID。

PID

进程 ID。 

PPID

父进程 ID。 

C

用于调度的处理器使用率。使用 -c 选项时,将不显示此字段。

CLS

进程所属的调度类,例如实时、系统或分时。只有 -c 选项包括此字段。

PRI

内核线程的调度优先级。数值越大,表示优先级越高。 

NI

进程的 nice 数值,该数值对其调度优先级有影响。进程的 nice 值越高,意味着其优先级越低。

ADDR

proc 结构的地址。

SZ

进程的虚拟地址大小。 

WCHAN

进程休眠的事件或锁定的地址。  

STIME

以小时、分钟和秒表示的进程开始时间。 

TTY

从中启动进程或其父级的终端。问号表示没有控制终端。 

TIME

进程自开始以来使用的 CPU 时间总量。 

CMD

生成进程的命令。  

使用 /proc 文件系统和命令

使用进程命令可以显示有关 /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 命令的某些选项相似,区别在于这些命令提供的输出更详细。

通常,进程命令可执行以下操作:

使用进程命令管理进程 (/proc)

通过使用一些进程命令,可以显示有关进程的详细技术信息或者控制活动进程。表 12–3 列出了一些 /proc 命令。

如果某个进程陷入无限循环或者执行时间过长,则可能需要停止(中止)该进程。有关使用 kill 或 pkill 命令停止进程的更多信息,请参见第 12 章。

/proc 文件系统是一个目录分层结构,其中包括状态信息和控制功能的附加子目录。

/proc 文件系统还提供了 xwatchpoint功能,用于重新映射在进程地址空间各页中的读写权限。该工具没有限制,并且是 MT-safe(多线程安全)的。

为了使用 /proc 的 xwatchpoint 功能,已修改调试工具,这意味着整个 xwatchpoint 进程会更快。

使用 dbx 调试工具设置 xwatchpoint 时,已删除以下限制:

有关更多信息,请参见 proc(4) 和 mdb(1) 手册页。

Procedure如何列出进程

  1. 使用 ps 命令可列出系统中的所有进程。


    $ ps [-efc]
    ps

    只显示与您的登录会话关联的进程。

    -ef

    显示系统中正在执行的所有进程的全部信息。

    -c

    显示进程调度程序信息。


示例 12–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
    .
    .
    .    

Procedure如何显示有关进程的信息

  1. 获得要显示更多信息的进程的进程 ID。


    # pgrep process
    

    其中,process 是要显示更多信息的进程的名称。

    进程 ID 显示在输出的第一列中。

  2. 显示所需进程信息。


    # /usr/bin/pcommand pid
    
    pcommand

    是要运行的 (/proc) 命令。表 12–3 列出并介绍了这些命令。

    pid

    标识进程 ID。


示例 12–2 显示有关进程的信息

以下示例显示如何使用进程命令来显示有关 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
  1. 获得 cron 进程的进程 ID

  2. 显示 cron 进程的当前工作目录

  3. 显示包含 cron 进程的进程树

  4. 显示 fstat 和 fcntl 信息


Procedure如何控制进程

  1. 获得要控制的进程的进程 ID。


    # pgrep process
    

    其中,process 是要控制的进程的名称。

    进程 ID 显示在输出的第一列中。

  2. 使用相应的进程命令来控制进程。


    # /usr/bin/pcommand pid
    
    pcommand

    是要运行的进程 (/proc) 命令。表 12–3 列出并介绍了这些命令。

    pid

    标识进程 ID。

  3. 验证进程状态。


    # ps -ef | grep pid
    

示例 12–3 控制进程

以下示例显示如何使用进程命令来停止和重新启动 dtpad 进程。


# pgrep dtpad 1
2921
# pstop 29212 
# prun 2921 3
  1. 获得 dtpad 进程的进程 ID

  2. 停止 dtpad 进程

  3. 重新启动 dtpad 进程


终止进程(pkill、kill)

有时,您可能需要停止(中止)进程。该进程可能处于无限循环中。或者,您可能启动了一个大型作业,并且希望在完成之前使其停止。您可以中止属于您的任何进程。超级用户可以中止系统中的任何进程,但进程 ID 为 0、1、2、3 和 4 的进程除外。中止这些进程很可能会使系统崩溃。

有关更多信息,请参见 pgrep(1)、pkill(1) 和 kill(1) 手册页。

Procedure如何终止进程 (pkill)

  1. (可选的)要终止另一个用户的进程,请成为超级用户或同等角色。

  2. 获得要终止的进程的进程 ID。


    $ pgrep process
    

    其中,process 是要终止的进程的名称。

    例如:


    $ pgrep netscape
    587
    566

    在输出中显示进程 ID。


    注 –

    要获得有关 Sun Ray 的进程信息,请使用以下命令:


    # ps -fu user
    

    此命令将列出所有用户进程。


    # ps -fu user | grep process
    

    此命令可为用户找到特定进程。


  3. 终止进程。


    $ pkill [signal] process
    
    signal

    当 pkill 命令行语法中不包含任何信号时,使用的缺省信号为 –15 (SIGKILL)。将 –9 信号 (SIGTERM) 与 pkill 命令一起使用,可以确保进程快速终止。但是,不应使用 –9 信号来中止特定进程,例如数据库进程或 LDAP 服务器进程。结果是可能丢失数据。

    process

    是要停止的进程的名称。


    提示 –

    使用 pkill 命令终止进程时,先尝试使用该命令本身,而不包括信号选项。等待几分钟确定进程是否终止,然后再使用带有 -9 信号的 pkill 命令。


  4. 验证进程是否已终止。


    $ pgrep process
    

    pgrep 命令的输出中应不再列出已终止的进程。

Procedure如何终止进程 (kill)

  1. (可选的)要终止另一个用户的进程,请成为超级用户或同等角色。

  2. 获得要终止的进程的进程 ID。


    $ ps -fu user
    

    其中,user 是要为其显示进程的用户。

    进程 ID 显示在输出的第一列中。

  3. 终止进程。


    $ kill [signal-number] pid
    
    signal

    当 kill 命令行语法中不包括任何信号时,使用的缺省信号为 –15 (SIGKILL)。将 –9 信号 (SIGTERM) 与 kill 命令一起使用,可以确保进程快速终止。但是,不应使用 –9 信号来中止特定进程,例如数据库进程或 LDAP 服务器进程。结果是可能丢失数据。

    pid

    是要终止的进程的进程 ID。


    提示 –

    使用 kill 命令停止进程时,先尝试使用该命令本身,而不包括信号选项。等待几分钟以确定进程是否终止,然后再使用带有 -9 信号的 kill 命令。


  4. 验证进程是否已终止。


    $ pgrep pid
    

    pgrep 命令的输出中应不再列出已终止的进程。

调试进程(pargs、preap)

pargs 命令和 preap 命令可以改进进程调试。pargs 命令可以列显与实时进程或核心转储文件关联的参数和环境变量。preap 命令可以删除不再存在(僵停)的进程。僵停进程尚不具有由父进程请求的退出状态。这些进程通常是无害的,但如果数量众多,则会占用系统资源。可以使用 pargs 和 preap 命令检查您有权检查的任何进程。作为超级用户,您可以检查任何进程。

有关使用 preap 命令的信息,请参见 preap(1) 手册页。有关使用 pargs 命令的信息,请参见 pargs(1) 手册页。另请参见 proc(1) 手册页。


示例 12–4 调试进程 (pargs)

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