在 Oracle® Solaris 11.2 中管理系统信息、进程和性能

退出打印视图

更新时间: 2014 年 9 月
 
 

用于管理系统进程的命令

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

表 2-1  用于管理进程的命令
命令
描述
手册页
pspgrepprstatpkill
检查系统中活动进程的状态,并显示有关这些进程的详细信息。
pkill
功能与 pgrep 相同,但通过名称或其他属性来查找进程或向进程发送信号,然后终止进程。像 kill 命令一样向每个匹配的进程发送信号,而不列显进程 ID。
pargs, preap
协助进行进程调试。
dispadmin
列出缺省进程调度策略。
priocntl
为优先级类指定进程并管理进程优先级。
nice
更改分时进程的优先级。
psrset
将特定进程组绑定到一组处理器而非一个处理器。

使用 ps 命令

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

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

  • 进程的当前状态

  • 进程ID

  • 父进程 ID

  • 用户 ID

  • 调度类

  • 优先级

  • 进程的地址

  • 已用内存

  • 已用 CPU 时间

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

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 号存储在 PROCFS 中。

表 2-2  进程命令 (/proc)
进程命令
描述
pcred
显示进程凭证信息
pfiles
为进程中打开的文件报告 fstatfcntl 信息
pflags
显示 /proc 跟踪标志、暂挂信号和保留信号以及其他状态信息
pldd
列出链接至进程中的动态库
pmap
显示每个进程的地址空间图
psig
列出每个进程的信号操作和处理程序
prun
启动每个进程
pstack
显示每个进程中的每个轻量级进程的十六进制符号栈跟踪
pstop
停止每个进程
ptime
使用微状态记帐记录进程的时间
ptree
显示包含该进程的进程树
pwait
在进程终止后显示状态信息
pwdx
显示进程的当前工作目录

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

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

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

  • 显示有关进程的更多信息,例如 fstatfcntl、工作目录以及父进程和子进程树

  • 通过允许用户停止或恢复进程来提供对进程的控制

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

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

如果某个进程陷入无限循环或者执行时间过长,则可能需要停止(中止)该进程。有关使用 killpkill 命令停止进程的更多信息,请参见Chapter 2, 管理系统进程

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

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

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

    使用 dbx 调试工具设置 xwatchpoints 时,以下限制不再适用:

  • 由于基于 SPARC 的系统注册窗口而在栈的本地变量中设置 xwatchpoints

  • 在多线程进程中设置 xwatchpoints

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

如何列出进程

  • 使用 ps 命令可列出系统中的所有进程。
    $ ps [-efc]
    ps

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

    –ef

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

    –c

    显示进程调度程序信息。

示例 2-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 18:04:04 ?           0:15 sched
    root     5     0   0 18:04:03 ?           0:05 zpool-rpool
    root     1     0   0 18:04:05 ?           0:00 /sbin/init
    root     2     0   0 18:04:05 ?           0:00 pageout
    root     3     0   0 18:04:05 ?           2:52 fsflush
    root     6     0   0 18:04:05 ?           0:02 vmtasks
  daemon   739     1   0 19:03:58 ?           0:00 /usr/lib/nfs/nfs4cbd
    root     9     1   0 18:04:06 ?           0:14 /lib/svc/bin/svc.startd
    root    11     1   0 18:04:06 ?           0:45 /lib/svc/bin/svc.configd
  daemon   559     1   0 18:04:49 ?           0:00 /usr/sbin/rpcbind
  netcfg    47     1   0 18:04:19 ?           0:01 /lib/inet/netcfgd
   dladm    44     1   0 18:04:17 ?           0:00 /sbin/dlmgmtd
  netadm    51     1   0 18:04:22 ?           0:01 /lib/inet/ipmgmtd
    root   372   338   0 18:04:43 ?           0:00 /usr/lib/hal/hald-addon-cpufreq
    root    67     1   0 18:04:30 ?           0:02 /lib/inet/in.mpathd
    root   141     1   0 18:04:38 ?           0:00 /usr/lib/pfexecd
  netadm    89     1   0 18:04:31 ?           0:03 /lib/inet/nwamd
    root   602     1   0 18:04:50 ?           0:02 /usr/lib/inet/inetd start
    root   131     1   0 18:04:35 ?           0:01 /sbin/dhcpagent
  daemon   119     1   0 18:04:33 ?           0:00 /lib/crypto/kcfd
    root   333     1   0 18:04:41 ?           0:07 /usr/lib/hal/hald --daemon=yes
    root   370   338   0 18:04:43 ?           0:00 /usr/lib/hal/hald-addon-network-discovery
    root   159     1   0 18:04:39 ?           0:00 /usr/lib/sysevent/syseventd
    root   236     1   0 18:04:40 ?           0:00 /usr/lib/ldoms/drd
    root   535     1   0 18:04:46 ?           0:09 /usr/sbin/nscd
    root   305     1   0 18:04:40 ?           0:00 /usr/lib/zones/zonestatd
    root   326     1   0 18:04:41 ?           0:03 /usr/lib/devfsadm/devfsadmd
    root   314     1   0 18:04:40 ?           0:00 /usr/lib/dbus-daemon --system
    .
		.
		.

如何显示有关进程的信息

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

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

  2. 显示进程信息。
    # /usr/bin/pcommand PID
    pcommand

    您希望运行的进程命令。Table 2–2 列出并介绍了这些命令。

    PID

    标识进程 ID。

示例 2-2  显示有关进程的信息

以下示例显示如何使用进程命令来显示有关 cron 进程的更多信息。

# pgrep cron Obtains the process ID for the cron process
4780
# pwdx 4780 Displays the current working directory for the cron process
4780:   /var/spool/cron/atjobs
# ptree 4780 Displays the process tree that contains the cron process
4780  /usr/sbin/cron
# pfiles 4780 Displays fstat and fcntl information
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. 获得要控制的进程的进程 ID。
    # pgrep process

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

  2. 使用相应的进程命令来控制进程。
    # /usr/bin/pcommand PID
    pcommand

    您希望运行的进程命令。Table 2–2 列出并介绍了这些命令。

    PID

    标识进程 ID。

  3. 验证进程状态。
    # ps -ef | grep PID

终止进程(pkill、kill

有时,您可能需要停止(中止)无限循环进程,或在完成前停止大型作业。您可以中止属于您的任何进程。系统管理员可以中止系统中的任何进程,但进程 ID 为 01234 的进程除外。中止这些进程很可能会使系统崩溃。

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

如何终止进程 (pkill)

  1. ()要终止其他用户的进程,请承担 root 角色。
  2. 获得要终止的进程的进程 ID。
    $ pgrep process

    例如:

    $ pgrep netscape
    587
    566

    在输出中显示进程 ID。


    注 -  要获取有关 Sun Ray 系统的进程的信息,请使用以下命令:

    列出所有用户进程:

    # ps -fu user

    定位某位用户拥有的特定进程:

    # ps -fu user | grep process

  3. 终止进程。
    $ pkill [signal] PID
    signal

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

    PID

    要停止的进程的名称。


    提示  -  使用 pkill 命令终止进程时,先尝试使用该命令本身,而不包括信号选项。如果几分钟后进程仍然没有终止,请使用带有 -9 信号的 pkill 命令。
  4. 验证进程是否已终止。
    $ pgrep process

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

如何终止进程 (kill)

  1. ()要终止其他用户的进程,请承担 root 角色。
  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. 验证进程是否已终止。
    $ ps

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

调试进程(pargs preap

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

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

示例 2-3  调试进程 (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