系统管理指南:高级管理

用于管理系统进程的命令

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

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

命令  

说明 

手册页 

pspgrepprstatpkill

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

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

为进程中打开的文件报告 fstatfcntl 信息

pflags

列显 /proc 跟踪标志、暂挂信号和保留信号以及其他状态信息

pldd

列出链接至进程中的动态库 

pmap

列显每个进程的地址空间图 

psig

列出每个进程的信号操作和处理程序 

prun

启动每个进程 

pstack

为每个进程中的每个 lwp 列显十六进制符号栈跟踪 

pstop

停止每个进程 

ptime

使用微状态记帐记录进程的时间 

ptree

显示包含该进程的进程树 

pwait

在进程终止后显示状态信息 

pwdx

显示进程的当前工作目录 

有关更多信息,请参见 proc(1)

进程工具与 ps 命令的某些选项相似,区别在于这些命令提供的输出更详细。

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

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

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

如果某个进程陷入无限循环或者执行时间过长,则可能需要停止(中止)该进程。有关使用 killpkill 命令停止进程的更多信息,请参见第 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. 显示 fstatfcntl 信息


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 为 01234 的进程除外。中止这些进程很可能会使系统崩溃。

有关更多信息,请参见 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 命令的输出中应不再列出已终止的进程。

调试进程(pargspreap

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

有关使用 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