AIX平台查看進程打開的文件(轉)


轉自:http://www.skyatlas.net/?p=11607

最近剛好處理了一個Oracle數據庫因為file descriptor耗盡,不能繼續工作的案例。Oracle的MNL進程,打開了太多的文件,導致了這個錯誤。

背景:

  • Unix中一切皆文件,socket,file…
  • /proc 虛擬文件系統可以方便查看進程信息,包括打開的文件(fd,file descriptor)
  • 大多數linux系統可以使用lsof來查看、使用/proc中包含的信息

Aix環境查看進程打開的文件

進入/proc/<mnl_process_pid>目錄,查看fd子目錄,可以查看所有打開的fd(file descriptor)

# cd /proc/184422/fd
# ls -l

這個文件夾下都是一些數字(fd),接下來使用相關工具,找到打開的都是什么文件

procfiles 命令

procfiles <process_pid> —— 命令使用方式

# procfiles 184422

Current rlimit: 2147483647 file descriptors
   4: S_IFREG mode:0444 dev:10,5 ino:13407 uid:0 gid:0 rdev:0,0
      O_RDONLY size:4811 

會顯示如上所示的信息,4 是 fd,文件在設備10,5上,文件系統的inode是13407
下面我們來查看dev:10,5 對應哪塊磁盤

# cd /dev
# ls -l | grep "10, *5"
brw-rw----   1 root     system       10,  5 Oct 10 2005  hd2
crw-rw----   1 root     system       10,  5 Oct 10 2005  rhd2

所以,可知文件存儲在/dev/hd2上(hd2是塊設備,rhd2是字符設備)/dev/hd2對應什么文件系統呢?

# lsfs | grep hd2
/dev/hd2        --         /usr           jfs2 3801088 yes no

由此可知,該設備對應/usr 文件系統,現在知道文件系統是/usr,inode是13407;先查看這個文件的信息:

# istat 13407 /usr
Inode 13407 on device 10/5
File Protection: rw-r--r--
Owner: 2(bin)           Group: 2(bin)
Link count:   1         Length 4811 bytes
Last updated:   Tue Aug 24 16:14:48 CDT 2004
Last modified:  Mon Jul 12 11:33:31 CDT 2004
Last accessed:  Wed Aug  9 09:16:28 CDT 2006
Block pointers (hexadecimal): 1892c

文件名是什么?

# cd /usr
# find . -inum 13407 -exec ls -l {} \;
-rw-r--r--   1 bin      bin            4811 Jul 12 2004
./lib/nls/msg/en_US/hostmibd.cat

所以呢,通過上述操作,一步步,從/proc中的fd,最終定位到對應的文件位置(linux中沒這么多步驟需要)

pstat命令

可使用pstat命令,查看進程的file descriptor table
首先獲取要查看的進程PID:

# ps -ef | grep cron
    root 323762      1   0   Oct 06      -  0:07 /usr/sbin/cron

上述輸出,顯示PID是323762,轉化為16進制:0x4F0B2

# pstat -a | grep -i 4F0B2
SLT ST    PID   PPID   PGRP   UID  EUID  TCNT  NAME
 79 a   4f0b2      1  4f0b2     0     0     1  cron

上述命令,顯示該進程對應的Slot(SLT)為79(后述命令要使用Slot)

# pstat -u 79 | grep FILE
FILE SYSTEM STATE
FILE DESCRIPTOR TABLE

# pstat -u 79 | grep -p "FILE DESCRIPTOR TABLE"
FILE DESCRIPTOR TABLE
*ufd: 0xf00000002ff49e20
fd 0: fp = 0xf1000714500080e0 flags = 0x0080 count = 0x0000
fd 1: fp = 0xf100071450007fa0 flags = 0x0080 count = 0x0000
fd 2: fp = 0xf100071450007fa0 flags = 0x0080 count = 0x0000
fd 3: fp = 0xf100071450007780 flags = 0x0080 count = 0x0000
fd 4: fp = 0xf100071450007af0 flags = 0x0080 count = 0x0000
fd 5: fp = 0xf1000714500079b0 flags = 0x0080 count = 0x0000
fd 6: fp = 0xf1000714500066a0 flags = 0x0080 count = 0x0000
fd 7: fp = 0xf100071450008270 flags = 0x0080 count = 0x0000
fd 8: fp = 0xf1000714500081d0 flags = 0x0080 count = 0x0000
fd 9: fp = 0xf100071450008220 flags = 0x0080 count = 0x0000
fd 10: fp = 0xf100071450008180 flags = 0x0080 count = 0x0000
fd 11: fp = 0xf1000714500082c0 flags = 0x0080 count = 0x0001
fd 12: fp = 0xf100071450008130 flags = 0x0081 count = 0x0000

lsof命令

默認狀態下Aix可能沒有lsof命令,如果有可以直接使用lsof查看進程打開的文件

# lsof -p pid


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM