lsof-系统管理和诊断工具aixhpux学习资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个非常有用的系统管理和诊断工具—lsof的介绍和使用技巧lsof是一个公共的域软件,适用于多个操作系统平台(如HPUX,AIX,Tru-64, etc.),是一个HP unsupported tool,但该工具可详细列出各个进程所打开的文
件、TCP/UDP端口、sockets等大量相关信息,可按照用户、进程号、文件名、端口号等线索进行查询和过滤,从而可对许多系统故障的诊断,系统性能的优化等带来很大的帮助。
使用方法简介:
lsof –h #列出帮助信息
lsof #列出目前系统中所打开的所有文件和端口所对应的信息
lsof -p <PID> #列出相应进程打开的文件和端口
lsof -i -P |grep <port #> #列出打开相应端口号的进程
其它:
lsof -nP -i tcp:512-1024 #列出在512-1024之间的已打开的TCP端口信息lsof -nP -i udp:512-1024 #列出在512-1024之间的已打开的UDP端口信息lsof -nP -i tcp:842 #列出TCP端口842的信息
lsof -nP -i tcp:telnet #列出Telnet端口的信息
如下是一些实用范例和技巧的介绍:
1、查找系统中被锁定的文件以及文件锁nflock的使用情况
lsof的输出如下所是示:其中FD域的最后一个字母表示锁的类型,w是写锁定,r是读锁定。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dmisp 1094 root 5uw REG 64,0x8 700432 2838 /var (/de v/vg00/lvo
l8)
mad 1145 root 3wW REG 64,0x6 4 15662 /opt (/dev/vg00/lvo
l6)
scrdaemon 1456 root 3wW REG 64,0x8 0 1297 /var (/dev/vg00/lvo
l8)
perflbd 1662 root 5uw REG 64,0x8 5 3142 /var/opt/perf/dataf iles/.perflbd.pid
scopeux 1690 root 13ur REG 64,0x8 9816 1661 /var/opt/perf/dataf iles/logindx
scopeux 1690 root 14ur REG 64,0x8 8860932 1662 /var/opt/perf/dataf iles/logglob
scopeux 1690 root 15ur REG 64,0x8 8366488 1663 /var/opt/perf/dataf iles/logappl
scopeux 1690 root 16ur REG 64,0x8 6468 1664 /var/opt/perf/dataf iles/logproc
scopeux 1690 root 17ur REG 64,0x8 9844350 1665 /var/opt/perf/dataf iles/logdev
scopeux 1690 root 18ur REG 64,0x8 10018820 1666 /var/opt/perf/dataf iles/logtran
swagentd 1702 root 5uW REG 64,0x8 207 33 /var/adm/sw/host_ob ject
可用如下命令抓出系统的所有文件锁定信息:
lsof | awk 'match("NrRwWuUx",substr($0,27,1))' #for version 4.61 -- 4.71
2、使用lsof命令找出使用某设备的进程,解决MC/SG不能正常停
应用包的问题
在一些情况下,MC/SG不能正常中止应用包,原因是“device busy”,我们知道MC/SG在停包时会使用fuser来清除使用某文件系统的进程,以便成功umount该文件系统,但仍然可能会有如下的情况使得不能正常halt package:
a)一些应用进程在包文件系统之上打开了socket;
b)包应用直接使用了裸设备(如DB),未正常释放。
上述两种情况采用fuser都不能正常清除相应的进程,可以使用losf来解决,如下是一个例子,可用于加入MC/SG control脚本的
customer_defined_halt_commands()中来解决这一问题:
lsof based kill script to free all package VGs
retvalue=$? # save exit status from above
LSOF="/usr/contrib/bin/lsof -t"
#LSOF="/usr/contrib/bin/lsof -t -b" # DevIDs required for -b
print "$(date '+%b %e %X') - Node \"$(hostname)\": \c"
print "Using $LSOF to find processes keeping VGs busy: ${VG[@]}" lsoflvols=$(for vg in ${VG[@]}; do
find /dev/$vg ! -name group -type c -o -type b
done)
[[ -n $lsoflvols ]] && lsofpids=$($LSOF $lsoflvols)
[[ -n $lsofpids ]] && echo kill -9 $lsofpids && kill -9 $lsofpids (return $retvalue) # restore saved exit status
# end of lsof based kill script
3、查找一个打开已删除文件的进程
有时我们手工删除一些文件以释放文件系统的空间,但删除以后用bdf命令查看,发现文件系统的空间并未释放,这时可能是在删除该文件的时候有进程正打开该文件,没有关闭。
可以采用lsof找出这些进程。
下面是一个例子:
# tsm #启动多个会话
在其中一个会话:
1) # cp /var/adm/syslog/syslog.log /tmp
2) # cd /tmp
# ls -i syslog.log
82 syslog.log
3) # more syslog.log
在另一个会话
4) # cd /tmp
# rm syslog.log
5) # ls -i syslog.log
hosts not found
使用lsof命令来发现该进程:
# lsof +aL1 /tmp
类似的应用还用很多,如查找打开某个TCP/UDP端口的进程,等等,欢迎大家共同研究。