分类:
2014-09-03 13:33:05
原文地址:Solaris中的酷命令 作者:东方蜘蛛
Solaris 中的命令非常之多,以致很难从中分离出那些很酷的命令。例如,有些命令报告程序进行每个系统调用时所要花费的时间,有些命令动态地显示系统活动信息,而且这些命令大部分都同时包含在了 Solaris 8 和 Solaris 9 中。这里,我将重点介绍其中一些命令,您或许会发现它们特别有用。
系统管理员是工具的使用者。通过实践经验,我们掌握了更多工具,并且增强了诊断问题以及实施解决方案的能力。本次专栏中包含的命令是通过经验、朋友、熟人以及出席 9 月举行的 SunNetwork 2002 大会收集到的。Solaris 内核的开发人员 Brian Cantrill 和 Mike Shapiro 所讲的"The /procodile Hunter"让人很有启发并令人感到惊恐,因为 Cantrill 编写代码来说明一个观点的速度比 Shapiro 能够讲解该观点的速度还要快!
有用的 Solaris 命令
truss -c (Solaris >= 8):这是个令人震惊的 truss 选项,它提供了被追踪命令的全面概要信息:
$ truss -c grep asdf work.doc
syscall seconds calls errors
_exit .00 1
read .01 24
open .00 8 4
close .00 5
brk .00 15
stat .00 1
fstat .00 4
execve .00 1
mmap .00 10
munmap .01 3
memcntl .00 2
llseek .00 1
open64 .00 1
---- --- ---
sys totals: .02 76 4
usr time: .00
elapsed: .05
它还能显示正在运行的进程的概要数据。在本例中,数据表明了从启动 truss 命令到用 control-c 来终止 truss 执行的期间,进程到底做了些什么。这对于判断进程为何被挂起是很理想的,因为您无须费力浏览整个 truss 的输出。
truss -d 和 truss -D (Solaris >= 8):这两个选项表明与truss显示的每个系统调用相关的时间信息。这对于找出定制代码或商业代码中的问题很有帮助。例如:
$ truss -d who
Base time stamp: 1035385727.3460 [ Wed Oct 23 11:08:47 EDT 2002 ]
0.0000 execve("/usr/bin/who", 0xFFBEFD5C, 0xFFBEFD64) argc = 1
0.0032 stat("/usr/bin/who", 0xFFBEFA98) = 0
0.0037 open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT
0.0042 open("/usr/local/lib/libc.so.1", O_RDONLY) Err#2 ENOENT
0.0047 open("/usr/lib/libc.so.1", O_RDONLY) = 3
0.0051 fstat(3, 0xFFBEF42C) = 0
. . .
truss -D 对于显示系统调用间的延迟时间更加有用:
Dilbert> truss -D who
0.0000 execve("/usr/bin/who", 0xFFBEFD5C, 0xFFBEFD64) argc = 1
0.0028 stat("/usr/bin/who", 0xFFBEFA98) = 0
0.0005 open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT
0.0006 open("/usr/local/lib/libc.so.1", O_RDONLY) Err#2 ENOENT
0.0005 open("/usr/lib/libc.so.1", O_RDONLY) = 3
0.0004 fstat(3, 0xFFBEF42C) = 0
这个例子中,stat 这个系统调用要比其他系统调用占用更长的时间。
truss -T:这是个很棒的调式帮助选项。在执行指定的系统调用时,它可以终止进程("-U"也执行同样的操作,不过是在进行用户级的函数调用时)。此时,将会获取用于进一步分析的 core 文件,或者使用一些 /proc 工具来确定进程各个方面的状态。
truss -l(在 Solaris 9 中已改进):显示多线程进程中每个调用的线程号。Solaris 9 中的 truss -l 经过了改进,最后还可以监视多线程的应用程序的执行。
Truss 的确是个功能强大的工具。例如,可在 core 文件中用于分析问题产生的原因。还可以通过"-u"选项来显示用户级的库(既可以为系统库,也可为程序员库)调用的详细信息。
pkg-ge:这是个用于自动获取免费软件包的好工具()。它通过 /etc/pkg-get.conf 来配置。一旦配置好并运行后,就运行 pkg-get -a 来获取可用包的列表以及运行 pkg-get -I 来获取并安装给定的包。
Plimit (Solaris >= 8):这个命令用于显示并设置正在运行的进程中的每个进程的限制。如果一个长时间运行的进程超过了某个限制(如打开的文件数目),使用该命令就十分方便。因为无须使用 limit 命令后重新运行该进程,plimit 就可以修改正在运行的进程。
coreadm (Solaris >= 8):在以前没有 coreadm 命令时,core dumps 被置于进程的工作目录下。并且 core 文件将会互相覆盖。而这个问题和其他更多问题都可以由 coreadm 来处理,它是一个管理 core 文件生成的工具。您可以通过该工具指定是否保存 core、core存储的位置和应保留的版本数目,等等。所有这些设置信息都是在重启前通过 coreadm 修改 /etc/coreadm.conf 来保存的。
pgrep (Solaris >= 8):pgrep 在 /proc 中搜索符合给定规则的进程,并返回进程的 ID。其中一个很棒的选项是"-n",它返回的是最新的满足条件的进程号。
preap (Solaris >= 9):除去僵尸进程。任何困于"z"状态(由 ps 命令显示)的进程,该命令都可将之从系统中清除。
pargs (Solaris >= 9):显示进程的参数及环境变量。
nohup -p (Solaris >= 9):nohup 命令可以用于启动一个进程,因此即使用于启动进程的 shell 被关闭(即进程获得"SIGHUP"信号),该进程仍然可以继续运行。这对于让一个后台任务不管碰到何种情况仍然可以继续运行是很有用的。但是如果您已经启动了一个进程,但稍后希望使它免受 HUP 信号的影响,该怎么办呢?在Solaris 9中, nohup -p 可以获取进程 ID 并使之忽略 SIGHUP 信号。
prstat (Solaris >= 8):prstat 也是 top 命令,但拥有更多功能。这两个命令都可以提供一个屏幕的关于进程的有用信息以及其他的相关信息,并且能频繁地更新,总之是个很棒的显示系统性能的窗口。但 prstat 要比 top 更加精确。它还提供了一些很好的选项。"-a"可以同时显示进程与用户的信息(默认由 CPU hog 排序)。"-c"使其执行很像 vmstat(在前一个报告下面接着显示新的报告)。"-C"显示在处理器集中的进程。"-j"显示一个"工程"中的进程。"-L"显示每个线程和每个进程的信息。"-m"和"-v"显示每个进程的很多详细的性能信息(包括 pages、traps、lock wait 和 CPU wait)。所有输出数据都可以按照在内存中设置的大小、虚拟内存大小、运行时间等等条件来排列。prstat 在没有 top 的系统中是个十分有用的工具,并且由于它的精确性,所以很可能取代 top(有些地方考虑到它是个被支持的程序而使用它)。
trapstat (Solaris >= 9):trapstat 以及 lockstat 和 kstat 是 Solaris 中最难以理解的命令。它们显示一个运行的操作系统内部中最具体的细节信息。每个命令对于解决 Solaris 系统中发生的古怪问题都是必不可少的。最好是将它们的输出随错误报告一起提交,但进一步的研究揭示,它们也能为一般应用提供有用信息。
vmstat -p (Solaris >= 8):在这个选项可以使用之前,要确定是哪种类型的内存命令导致系统页面调度几乎是不可能的(请查阅"se toolkit")。vmstat -p 可以解决此问题,因为它不但显示您的系统是否处于内存紧缺的情况(通过"sr"栏),而且还显示是否是由以下内容导致的:应用程序的代码,应用程序的数据或 I/O 。"-p"能够真正帮助找出 Solaris 中导致神秘的内存问题的原因。
pmap -x (Solaris >= 8,Solaris >= 9中进行了错误修复):如果已经得知进程中有内存问题,并且需要获得更多内存使用的详细信息,就可以使用 pmap -x。该命令将解释指定 ID 的目标进程的整个内存映射信息,如下:
# pmap -x 1779
1779: -ksh
Address Kbytes RSS Anon Locked Mode Mapped File
00010000 192 192 - - r-x-- ksh
00040000 8 8 8 - rwx-- ksh
00042000 32 32 8 - rwx-- [ heap ]
FF180000 680 664 - - r-x-- libc.so.1
FF23A000 24 24 - - rwx-- libc.so.1
FF240000 8 8 - - rwx-- libc.so.1
FF280000 568 472 - - r-x-- libnsl.so.1
FF31E000 32 32 - - rwx-- libnsl.so.1
FF326000 32 24 - - rwx-- libnsl.so.1
FF340000 16 16 - - r-x-- libc_psr.so.1
FF350000 16 16 - - r-x-- libmp.so.2
FF364000 8 8 - - rwx-- libmp.so.2
FF380000 40 40 - - r-x-- libsocket.so.1
FF39A000 8 8 - - rwx-- libsocket.so.1
FF3A0000 8 8 - - r-x-- libdl.so.1
FF3B0000 8 8 8 - rwx-- [ anon ]
FF3C0000 152 152 - - r-x-- ld.so.1
FF3F6000 8 8 8 - rwx-- ld.so.1
FFBFE000 8 8 8 - rw--- [ stack ]
-------- ------- ------- ------- -------
total Kb 1848 1728 40 -
这里,我们可以看到每一块内存,它们被用于做什么,占用了多大的(虚拟的和真实的)空间以及其模式信息。
df -h (Solaris >= 9):这个命令在 Linux 上已经应用十分普遍,刚刚转移到了 Solaris 平台。df -h 以一种方便阅读的形式显示文件系统的概要信息:
$ df -h
Filesystem size used avail capacity Mounted on
/dev/dsk/c0t0d0s0 4.8G 1.7G 3.0G 37% /
/proc 0K 0K 0K 0% /proc
mnttab 0K 0K 0K 0% /etc/mnttab
fd 0K 0K 0K 0% /dev/fd
swap 848M 40K 848M 1% /var/run
swap 849M 1.0M 848M 1% /tmp
/dev/dsk/c0t0d0s7 13G 78K 13G 1% /export/home
结束语
每个管理员都有一套日常使用的工具,以及另外一套在紧急情况下帮助解决问题的工具。本文介绍了各种各样的的命令及选项,它们不广为人知但却十分有用。您是否也保存了这样一些偏爱的工具呢?如果有,请也发送给我,让我可以扩展自己的工具集。另外,可以发送一些您不喜欢或是感觉有危险的工具,它们或许也可以变成有用的呢!
Peter Baer Galvin()是 Corporate Technologies 公司()的首席技术专家,还是一位重要的系统集成商和增值销售商。之前,Peter 曾是 Brown 大学计算机科学系的系统管理员。他为 Byte 和其他杂志撰写文章,也曾为 Pete's Wicked World的安全问题专栏和 Pete's Super Systems 的 Unix Insider()系统管理专栏撰写文章。Peter 还是 Operating Systems Concepts 和 Applied Operating Systems Concepts 这两本教科书的合著者。作为一名顾问和教员,Peter 教授课程并在全球范围的安全与系统管理问题上发表演讲。