Linux procfs詳解

1.0 proc文件系統總覽
在類Unix系統中體現了一種良好的抽象哲學,就是幾乎全部的數據實體都被抽象成一個統一的接口--文件來看待,這樣咱們就能夠用一些簡單的基本工具完成大量複雜的操做。在Linux中存在着一類特殊的僞文件系統,用於使用與文件接口統一的操做來完成各類功能,例如ptyfs、devfs、sysfs和procfs。而procfs就是其中應用最普遍的一種僞文件系統。
procfs是Linux內核信息的抽象文件接口,大量內核中的信息以及可調參數都被做爲常規文件映射到一個目錄樹中,這樣咱們就能夠簡單直接的經過echo或cat這樣的文件操做命令對系統信息進行查取和調整了。同時procfs也提供了一個接口,使得咱們本身的內核模塊或用戶態程序能夠經過procfs進行參數的傳遞。在當今的Linux系統中,大量的系統工具也經過procfs獲取內核參數,例如ps、lspci等等,沒有procfs它們將可能不能正常工做。
procfs的使用如同常規的文件系統同樣,例如加載一個procfs (首先肯定你的內核已經支持procfs默認如此):
# mount -t proc none /proc
也能夠在/etc/fstab中加入以下一行使系統在啓動時自動加載procfs(大多數系統中也是默認如此):
none /proc proc defaults 0 0
在proc文件系統中,主要包含三大類內容,進程相關部分,系統信息部分,以及系統子系統部分。在下面咱們能夠看到一個典型的procfs佈局:
> ls /proc
1 2 2166 2281 cmdline interrupts meminfo stat
13 2001 2167 3 cpuinfo iomem misc swaps
1646 2042 2168 4 crypto ioports modules sys
1780 2058 2169 5 devices irq mounts sysrq-trigger
1834 2087 2170 6 dma isapnp mtrr sysvipc
1838 2096 2171 7 driver kcore net tty
1857 2107 2207 71 execdomains kmsg partitions uptime
1877 2117 2208 8 fb ksyms pci version
1889 2143 2216 9 filesystems loadavg scsi
1905 2153 2217 apm fs locks self
1960 2165 2219 bus ide mdstat slabinfo

在上面的佈局中咱們能夠看到procfs包含的內容:
* 進程相關部分 (只讀)
這部分文件都是以數字爲名的子目錄,這個數字就是相關進程的進程ID,在 1.1節中會詳細介紹進程相關子目錄的結構和信息。
須要注意的是procfs中進程子系統部分的一個特殊點,就是/proc/self,它是指向當前執行進程的符號鏈接,或者說--是指向將來你將要執行指令的心靈感應:
> cat self/cmdline
catself/cmdline
在這個命令中,咱們但願它顯示當前進程的cmdline參數,它偏偏就顯示了當前進程--咱們所執行的這條命令,cat self/cmdline。幸虧這條指令顯示出的信息會忽略空格,致使顯示略微的不正常,不然咱們卻是能夠很容易的使用`cat self/cmdline`這樣的命令製造出永遠循環執行的進程來.
* 內核信息部分 (只讀)
這部分文件一樣處於/proc的頂層目錄,不過它們大部分都是常規、只讀的文本文件,能夠直接用cat查看信息。做爲系統內核執行體的抽象,咱們也能夠把它看做內核"進程"的信息部分,固然雖然並不存在這個進程實體。這裏比較特別的一個文件是 /proc/cmdline :
>cat cmdline
ro root=/dev/hda2
在這個文件中存放的是系統內核引導時的命令行參數。此部份內容將在 1.3節中說明。
* 內核各子系統相關部分 (部分可調)
這部分是系統內核參數調整的重頭戲,在procfs中,除去上面所述的兩部份內容外,還有很大一部分信息文件被存放在了一些並不是以數字命名的特殊目錄中,這些目錄下的信息就是內核各個重要子系統的信息和可調參數,主要有:
bus 總線信息(只讀)
drivers 驅動信息(只讀)
fs 文件系統特別信息(只讀)
ide IDE接口信息(只讀)
irq IRQ信息(只讀)
net 網絡子系統信息(只讀)
scsi SCSI系統信息(只讀)
sysvipc IPC子系統信息(只讀)
tty tty子系統信息(只讀)
sys 系統內核可調參數 (可調)
做爲Linux系統內核參數的抽象文件接口,Linux內核的大部分默承認調參數都被放在了 /proc/sys目錄下,這些參數都以常規文件的形式體現,而且能夠用echo/cat等文件操做命令進行調整,調整的效果是即時的,而且在系統運行的整個生命週期之間都有效(知道再次改變它們或者系統重啓)。
固然Linux也提供了另一種途徑sysctl來調整這些參數,sysctl是從BSD系統繼承而來的一種系統參數動態調整方法,sysctl的使用更爲簡單,而且可使用/etc/sysctl.conf保存配置以在下次啓動時自動加載這些設置。
對於內核信息和參數的說明將在 1.4 - 1.7節中解釋;對於/proc/sys中的可調參數將在第二章中詳細說明。
1.1 進程相關子目錄
在/proc目錄中包含了一些以數字爲名的子目錄,這些目錄就是系統當前運行進程的proc抽象。每個目錄都以相關聯的活動系統進程PID爲目錄名,在目錄下包含了一些文件,用於顯示進程相關的信息。每一個進程映射子目錄的結構都如 Table 1-1.
..............................................................................
文件名 內容
cmdline 執行進程的命令行參數
cpu 在SMP系統中近程最後的執行CPU (2.4)(smp)
cwd 到當前工做目錄的符號連接
environ 環境變量
exe 連接到進程對應的源可執行文件
fd 包含全部進程打開的文件描述符的子目錄
maps 進程內存映射,包含進程執行空間以及動態連接庫信息 (2.4)
mem 進程內存空間
root 鏈接到進程執行時的 / (root)目錄
stat 進程狀態
statm 進程內存狀態信息
status 進程狀態總覽,包含進程名字、當前狀態和各類信息統計
..............................................................................
舉例來講,要獲取一個進程的狀態,只要讀取下面進程PID子目錄下的status文件 /proc/PID/status:
>cat /proc/self/status
Name: cat
State: R (running)
Pid: 5452
PPid: 743
TracerPid: 0 (2.4)
Uid: 501 501 501 501
Gid: 100 100 100 100
Groups: 100 14 16
VmSize: 1112 kB
VmLck: 0 kB
VmRSS: 348 kB
VmData: 24 kB
VmStk: 12 kB
VmExe: 8 kB
VmLib: 1044 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 00000000fffffeff
CapPrm: 0000000000000000
CapEff: 0000000000000000
如同第一節所說,/proc/self鏈接指向讀取它自身的進程映像,在以後一節的例子中都將以它做爲咱們的範例。
這條命令顯示的信息與你經過 /bin/ps 命令獲取到的進程信息基本相同,這恰巧是由於,ps也是經過讀取procfs來獲取這些信息的。statm 文件包含了更詳細的進程內存狀態,statm的詳細內容按照數據項由左向右依次如 Table 1-2.
> cat /proc/self/statm
105 105 93 4 12 89 12
..............................................................................
數據項 內容
size 程序大小
resident 常駐內存空間大小
shared 共享內存頁數
trs 代碼段佔用內存頁數
drs 數據/堆棧段佔用內存頁數
lrs 引用庫佔用內存頁數
dt 髒頁數量
..............................................................................
1.2 內核數據
類似於進程入口,在/proc目錄下的其餘一些文件給出了內核信息數據,這些文件包含了系統當前運行內核相關信息。/proc目錄下內核相關信息文件在Table 1-3 中列出,依賴於您的系統配置和加載的內核模塊,在您的系統中的顯示可能會略有不一樣。
..............................................................................
文件 內容
apm 高級電源管理信息
bus bus總線相關信息
cmdline 內核引導命令行參數
cpuinfo cpu信息
devices 當前可用設備 (包含全部塊設備和字符設備)
dma DMA通道使用情況
filesystems 當前內核支持的文件系統
driver 驅動相關信息 (2.4)
execdomains 安全相關的Execdomains信息 (2.4)
fb Frame Buffer 設備 (2.4)
fs 本地文件系統參數 (2.4)
ide IDE子系統相關信息的子目錄
interrupts 中斷使用情況
iomem 內存映射圖 (2.4)
ioports I/O端口使用情況
irq 關聯到cpu的irq使用情況 (2.4)(smp?)
isapnp ISA PnP (即插即用) 信息 (2.4)
kcore Kernel core image,內核轉儲映像 (2.4)
kmsg Kernel messages
ksyms Kernel symbol table,內核符號表
loadavg 最後一、5 、15 分鐘的平均負載
locks Kernel locks, 內核鎖信息
meminfo 內存信息
misc 內核信息雜項
modules 已加載內核模塊列表
mounts 已加載的文件系統
net 網絡子系統信息
partitions 已識別的本地系統分區表
pci PCI總線相關信息,在新版本中指向 /proc/bus/pci/ 目錄 (2.4)
rtc rtc實時鐘
scsi SCSI 總線信息
slabinfo Slab 內存分配池信息
stat 內核狀態總覽
swaps Swap 空間狀態
sys 內核系統參數 (參見第二章)
sysvipc SysVIPC 資源狀態 (msg, sem, shm) (2.4)
tty TTY驅動信息
uptime 系統 uptime
version 內核版本
video video 資源狀態 (2.4)
..............................................................................
在proc文件系統中大多數文件都是可讀的文本,能夠直接使用系統中的常規文件處理命令進行操做。固然,這也依賴於目標文件的權限屬性。例如要查看系統中斷信息 /proc/interrupts:
> cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC PS/2 Mouse
13: 1 XT-PIC fpu
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0
在2.4版內核中,當使用了SMP時這個文件末尾會多出兩行SMP相關屬性 LOC & ERR :
> cat /proc/interrupts
CPU0 CPU1
0: 1243498 1214548 IO-APIC-edge timer
1: 8949 8958 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
5: 11286 10161 IO-APIC-edge soundblaster
8: 1 0 IO-APIC-edge rtc
9: 27422 27407 IO-APIC-edge 3c503
12: 113645 113873 IO-APIC-edge PS/2 Mouse
13: 0 0 XT-PIC fpu
14: 22491 24012 IO-APIC-edge ide0
15: 2183 2415 IO-APIC-edge ide1
17: 30564 30414 IO-APIC-level eth0
18: 177 164 IO-APIC-level bttv
NMI: 2457961 2457959
LOC: 2457882 2457881
ERR: 2155
NMI是每一個CPU上產生的不可屏蔽中斷(Non Maskable Interrupt)的計數;
LOC是每一個CPU上APIC本地中斷的計數。
ERR是SMP系統中IO-APIC總線失敗錯誤的計數,若是這個數量過高,可能你的內核運行會有問題,這時候就須要測試內核,查看硬件和APIC是否有兼容性問題。
在2.4內核中irq相關的內核信息被放在/proc/irq目錄下,在這個目錄下包含一個文件
prof_cpu_mask和每一個IRQ獨屬的一個子目錄。
> ls /proc/irq/
0 10 12 14 16 18 2 4 6 8 prof_cpu_mask
1 11 13 15 17 19 3 5 7 9
> ls /proc/irq/0/
smp_affinity
2.4內核中可使用IRQ綁定屬性,是某個或所有的IRQ掛接到SMP集合中的某個CPU上,這個特性能夠經過prof_cpu_mask和smp_affinity來調整。在默認狀況下這兩個文件的內容都"ffffffff",做爲一個位映射而存在,你可使用echo命令來指定一個CPU處理IRQ事件。
> cat /proc/irq/0/smp_affinity
ffffffff
> echo 1 > /proc/irq/prof_cpu_mask
這天命令的結果就是系統中只有第一個CPU能夠捕獲IRQ事件,若是您使用的是"echo 5"的話那麼第一和第四個CPU均可以捕獲和處理事件(1 + 4)。
在默認狀況下IRQ事件由IO-APIC分配,它將輪詢每一個配置中的CPU,等待其中一個處理事件響應。
在slabinfo文件文件中咱們能夠看到Linux內核的內存分配池信息,2.4版本內核中使用slab算法來爲內核對象(網絡緩存、目錄高速緩存以及文件分配表等等)分配內存頁。
在/proc目錄下還有三個重要的目錄: net,scsi和sys,咱們會在後面的章節中陸續描述;此外若是您的系統中沒有SCSI設備(或沒有SCSI驅動)的話,/proc/scsi目錄是不存在的。
1.3 IDE設備 /proc/ide
/proc/ide目錄下包含了全部內核識別出的IDE設備的信息。在/proc/ide目錄下包含drivers文件和若干個以IDE設備名或IDE控制器名爲名的子目錄。
> ls -alF /proc/ide/
total 3
dr-xr-xr-x 4 root root 0 10月 9 23:36 ./
dr-xr-xr-x 54 root root 0 2004-10-10 ../
-r--r--r-- 1 root root 0 10月 9 23:36 drivers
lrwxrwxrwx 1 root root 8 10月 9 23:36 hda -> ide0/hda/
lrwxrwxrwx 1 root root 8 10月 9 23:36 hdb -> ide0/hdb/
lrwxrwxrwx 1 root root 8 10月 9 23:36 hdc -> ide1/hdc/
dr-xr-xr-x 4 root root 0 10月 9 23:36 ide0/
dr-xr-xr-x 3 root root 0 10月 9 23:36 ide1/
-r--r--r-- 1 root root 0 10月 9 23:36 piix
drivers文件包含了當前加載的IDE設備驅動:
> cat /proc/ide/drivers
ide-floppy version 0.99.newide
ide-disk version 1.17
ide-default version 0.9.newide
在/proc/ide目錄下還能夠看到其餘一些以設備命名的目錄,在這些目錄下咱們能夠看到更詳細的信息。piix是IDE控制芯片組的名字,在你的系統中多是其餘名字。此外還包含若干個(通常的PC上是2個)IDE控制器爲名的目錄,以及以IDE終端設備名命名的快捷方式,它門將連接到控制器目錄下對應的設備文件上。
在ide*目錄中咱們能夠獲得更多的信息,如 Table 1-4.
..............................................................................
文件名 內容
channel IDE通道 (0 or 1)
config 配置 (only for PCI/IDE bridge)
mate Mate name
model IDE控制器的類型/芯片組
hd? IDE總線上鏈接的可用設備
..............................................................................
當前鏈接在控制器上的每一個設備也將成爲一個單獨的子目錄,如 Table 1-5.
..............................................................................
文件名 內容
cache 設備緩存大小
capacity 設備數據塊數量 (按 512Byte 塊)
driver 驅動和版本
geometry 物理和邏輯的設備參數
identify 設備標示塊
media 媒體類型
model 設備標識符(型號或名字)
settings 設備配置參數
smart_thresholds IDE disk management thresholds
smart_values IDE disk management values
..............................................................................
在這裏比較有用的信息是settings文件,它包含了一個驅動器相關的信息總覽:
# cat /proc/ide/ide0/hda/settings
name value min max mode
---- ----- --- --- ----
bios_cyl 526 0 65535 rw
bios_head 255 0 255 rw
bios_sect 63 0 63 rw
breada_readahead 4 0 127 rw
bswap 0 0 1 r
file_readahead 72 0 2097151 rw
io_32bit 0 0 3 rw
keepsettings 0 0 1 rw
max_kb_per_request 122 1 127 rw
multcount 0 0 8 rw
nice1 1 0 1 rw
nowerr 0 0 1 rw
pio_mode write-only 0 255 w
slow 0 0 1 rw
unmaskirq 0 0 1 rw
using_dma 0 0 1 rw
1.4 網絡信息 /proc/net
/proc/net 子目錄包含了系統中網絡相關的內核統計信息和視圖,常規的文件列表如Table 1-7 中說明; 若是你的內核支持IPV6,那麼還有一些IPV6相關信息在 Table 1-6中
..............................................................................
文件名 內容
udp6 UDP sockets (IPv6)
tcp6 TCP sockets (IPv6)
raw6 Raw 設備狀態 (IPv6)
igmp6 系統當前加入的IP多播地址 (IPv6)
if_inet6 IPv6 網絡接口地址列表
ipv6_route IPv6 內核路由表
rt6_stats IPv6 全局路由表狀態
sockstat6 Socket 狀態 (IPv6)
snmp6 Snmp 數據 (IPv6)
..............................................................................
..............................................................................
文件名 內容
arp 內核 ARP 表
atm atm設備接口信息
drivers 加載的驅動模塊信息
dev 網絡設備以及狀態
dev_mcast 二層多播組以及監聽設備信息
(包含interface index, label, number of references, number of
bound addresses).
dev_stat 網絡設備狀態
ip_fwchains ipchains 防火牆規則鏈 (2.2)
ip_fwnames ipchains 防火牆規則鏈名 (2.2)
ip_masq 包含IP假裝映射表的目錄 (2.2)
ip_masquerade 主IP假裝映射表 (2.2)
netstat 網絡狀態
raw 原始設備狀態
route 內核路由表
rpc 包含rpc信息的目錄
rt_cache 路由cache
snmp SNMP 數據
sockstat Socket 狀態
tcp TCP sockets
tr_rif Token ring RIF 令牌環網路由表
udp UDP sockets
unix UNIX domain sockets
wireless Wireless 接口數據 (Wavelan etc)
igmp 主機當前加入的IP多播組地址
psched 全局數據包調度參數
netlink PF_NETLINK sockets 列表
ip_mr_vifs 多播虛擬地址列表
ip_mr_cache 多播路由cache列表
..............................................................................
因爲2.4以後的內核引入了netfilter/iptables防火牆,所以在防火牆部分的信息與2.2略有不一樣:
..............................................................................
文件名 內容
ip_tables_matches iptables支持的過濾模式
ip_tables_names iptables規則表名字
ip_tables_targets iptables規則鏈目標
ip_conntrack iptables狀態檢測跟蹤表
..............................................................................
您可使用這些信息來查看當前系統中可用的網絡設備,以及這些設備上經過的流量和路由信息:
> cat /proc/net/dev
Inter-|Receive |[...
face |bytes packets errs drop fifo frame compressed multicast|[...
lo: 908188 5596 0 0 0 0 0 0 [...
ppp0:15475140 20721 410 0 0 410 0 0 [...
eth0: 614530 7085 0 0 0 0 0 1 [...
...] Transmit
...] bytes packets errs drop fifo colls carrier compressed
...] 908188 5596 0 0 0 0 0 0
...] 1375103 17405 0 0 0 0 0 0
...] 1703981 5535 0 0 0 3 0 0
若是系統中使用了Ethernet Channel特性,使若干個物理接口綁定爲一個邏輯設備的話,這個邏輯設備將會擁有一個以設備名命名的子目錄,其中包含一些bond模塊相關的特殊信息。例如把eth0和eth1綁定爲設備 bond0 ,那麼能夠在 /proc/net/bond0/目錄下看到bond的特殊信息,例如主從接口、鏈路狀態等等。
1.5 SCSI 設備信息
若是你的系統中含有任何SCSI設備,那麼在 /proc/scsi 目錄下能夠看到系統識別到的SCSI設備相關信息:
>cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: IBM Model: DGHS09U Rev: 03E0
Type: Direct-Access ANSI SCSI revision: 03
Host: scsi0 Channel: 00 Id: 06 Lun: 00
Vendor: PIONEER Model: CD-ROM DR-U06S Rev: 1.04
Type: CD-ROM ANSI SCSI revision: 02
系統中的SCSI設備將映射到/proc/scsi目錄下造成一個子樹,按照對應的設備模塊和設備總線號能夠查看相應設備的參數信息,例如一個Adaptec AHA-2940 SCSI 適配器:
> cat /proc/scsi/aic7xxx/0
Adaptec AIC7xxx driver version: 5.1.19/3.2.4
Compile Options:
TCQ Enabled By Default : Disabled
AIC7XXX_PROC_STATS : Disabled
AIC7XXX_RESET_DELAY : 5
Adapter Configuration:
SCSI Adapter: Adaptec AHA-294X Ultra SCSI host adapter
Ultra Wide Controller
PCI MMAPed I/O Base: 0xeb001000
Adapter SEEPROM Config: SEEPROM found and used.
Adaptec SCSI BIOS: Enabled
IRQ: 10
SCBs: Active 0, Max Active 2,
Allocated 15, HW 16, Page 255
Interrupts: 160328
BIOS Control Word: 0x18b6
Adapter Control Word: 0x005b
Extended Translation: Enabled
Disconnect Enable Flags: 0xffff
Ultra Enable Flags: 0x0001
Tag Queue Enable Flags: 0x0000
Ordered Queue Tag Flags: 0x0000
Default Tag Queue Depth: 8
Tagged Queue By Device array for aic7xxx host instance 0:
{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}
Actual queue depth per device for aic7xxx host instance 0:
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
Statistics:
(scsi0:0:0:0)
Device using Wide/Sync transfers at 40.0 MByte/sec, offset 8
Transinfo settings: current(12/8/1/0), goal(12/8/1/0), user(12/15/1/0)
Total transfers 160151 (74577 reads and 85574 writes)
(scsi0:0:6:0)
Device using Narrow/Sync transfers at 5.0 MByte/sec, offset 15
Transinfo settings: current(50/15/0/0), goal(50/15/0/0), user(50/15/0/0)
Total transfers 0 (0 reads and 0 writes)
1.6 並口信息 /proc/parport
/proc/parport 包含系統並口信息,按照並口端口號(0,1,2,...)每一個設備將映射到一個子目錄中。在這個目錄下包含的信息如 Table 1-8.
..............................................................................
文件名 內容
autoprobe IEEE-1284 標準兼容的設備ID信息
devices 端口使用的設備驅動列表
hardware 端口使用的base address, IRQ line 和 DMA channel.
irq 端口使用的IRQ號,你能夠寫入一個新值指定IRQ號 (IRQ number or none).
..............................................................................
1.7 TTY信息 /proc/tty
-------------------------
在/proc/tty目錄中包含了系統中當前在用的tty及其信息,在這個目錄中也能夠找到設備
信息和線路disciplines,如 Table 1-9.
Table 1-9: /proc/tty 中的文件
..............................................................................
文件名 內容
drivers 設備及引用計數
ldiscs registered line disciplines
driver/serial tty線路狀態
..............................................................................
要查看系統中的當前在用ttys,能夠簡單的查看 /proc/tty/drivers:
> cat /proc/tty/drivers
pty_slave /dev/pts 136 0-255 pty:slave
pty_master /dev/ptm 128 0-255 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
serial /dev/cua 5 64-67 serial:callout
serial /dev/ttyS 4 64-67 serial
/dev/tty0 /dev/tty0 4 0 system:vtmaster
/dev/ptmx /dev/ptmx 5 2 system
/dev/console /dev/console 5 1 system:console
/dev/tty /dev/tty 5 0 system:/dev/tty
unknown /dev/tty 4 1-63 console
本章介紹了 /proc 文件系統提供的系統運行時信息. 在 /proc 文件系統中,您不只能夠簡單直接的訪問進程相關信息,也能夠經過它查看各個方面的系統內核狀態。
在 /proc 文件系統中,大部分信息都以常規或文本文件的形式反映出來,您能夠任意使用簡單的文件處理命令來查看它(只要權限容許);若是某些文件不能被查看或者產生亂碼,那麼它多是一些特殊類型的文件,須要其它手段來處理,例如 /proc/kcore 能夠經過gdb等內核調試工具來查看,而其餘一些數據則能夠被ps、top等工具所理解。
在這一章中,咱們對procfs的結構進行了一下縱覽,對它的做用也該有一些瞭解了。在procfs中除了獲得大量系統內核信息以外,它最重要的一個做用莫過於對進程的監控和分析了。有了procfs,你也能夠寫出本身的ps/top來,甚至不用任何編程工具......
好比,不少Linux新手都經常遇到的一個問題,就是夾在了一個文件系統以後不能卸載,系統報告這樣的錯誤:
代碼:
# umount /db1                                           
umount: /db1: device is busy
經驗老到的管理員們都知道,這個問題是因爲某些進程的工做目錄還在這個目錄下,致使系統卷忙而沒法卸載,只要殺掉那個進程,文件系統就能夠正常卸載了。但到底是哪一個進程還在那裏呢?找起來恐怕也要費半天神。雖然有pfile和lsof之類的工具可用,但總 也有應急的時候吧,這棵小腳本就能夠爲你解憂。
代碼:
#!/bin/bash
#pcwd.sh,查找系統中工做在目標路徑下的進程,使用方法: pcwd.sh 路徑名
test $1 || { echo "Usage: pcwd.sh path(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
  do
  test -e /proc/$PID && (ls -alF /proc/$PID/cwd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is work in $1 ";
done
就是這樣短短的幾行代碼,甚至不用任何的臨時文件,咱們就獲取了執行命令前的當前系統進程表映像,而後遍歷每一個進程的proc目錄,找到佔用咱們目錄的"壞進程"。
在個人系統上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./pcwd.sh
Usage: pcwd.sh path(absolute path)
[elly@frost.llnl]/tmp# ./pcwd.sh /usr
Process 1283 (vi) is work in /usr ;
Process 3113 (bsh) is work in /usr ;
在上面的例子中,咱們只用了最簡單的四五個文件和文本處理命令,就完成了這個小程序,你甚至能夠把全部的語句寫在一行上,經過命令行或alias定義就完成這個功能。
把它稍稍修改一下就是另一個功能,查找正在使用某個文件的進程:
代碼:
#!/bin/bash
test $1 || { echo "Usage: pfile.sh filename(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
  do
  test -e /proc/$PID && (ls -alF /proc/$PID/fd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is openning $1;";
done
在我係統上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./pfile.sh
Usage: pfile.sh filename(absolute path)
[elly@frost.llnl]/tmp# ./pfile.sh access_log
Process 109 (httpd) is openning access_log;
Process 110 (httpd) is openning access_log;
Process 112 (httpd) is openning access_log;
Process 113 (httpd) is openning access_log;
Process 116 (httpd) is openning access_log;
Process 99 (httpd) is openning access_log;

目標文件名可使用相對或絕對路徑,甚至能夠只輸入半個文件名...固然路徑越精確查找的結果也越準確。在這個例子中,很容易就能夠擴展它的功能,讓它實現相似lsof的功能,能夠列舉系統中全部正在被使用的文件。好啦,咱們作一個有用點的程序。
ps,每臺機器上都有吧。不幸的是,在某些極端環境下,系統中的PS是不可靠的,好比,壞了...或被人替換了。
不少惡意的黑客入侵系統以後會在系統上安裝一類叫rootkit的後門包,用來替換系統中ps、netstat等重要程序以隱藏本身的痕跡,這個時候通常比較穩妥的辦法是本身上傳一份可靠的系統工具包,或者靜態編譯的工具包。固然,也能夠用這個土辦法,直 接從procfs裏讀取信息。(若是是比較高明的黑客,使用LKM等內核後門那這個就沒有用了哦)
範例:懶人的ps,就叫它lps吧。
代碼:
#!/bin/bash
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc' |tr -d ':' |sort `;
echo -e "PID PPID UID GID STAT  MEM TTY CMD"
for PID in $PSList
  do
  test -e /proc/$PID && sPID=`cat /proc/$PID/status |grep ^Pid: |awk '{print $2}'`
  && sPPID=`cat /proc/$PID/status |grep ^PPid: |awk '{print $2}'`
  && sTTY=`ls -alF /proc/$PID/fd |grep /dev/ |awk '{print $11}' |grep ty |head -n 1`
  && sUID=`cat /proc/$PID/status |grep ^Uid: |awk '{print $2}'`
  && sGID=`cat /proc/$PID/status |grep ^Gid: |awk '{print $2}'`
  && sSTAT=`cat /proc/$PID/status |grep ^State: |awk '{print $2 $3}'`
  && sMEM=`cat /proc/$PID/status |grep ^VmSize: |awk '{print $2 $3}'`
  && if [ -e /proc/$PID/exe ]
  then
     sCMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*' `
  else
     sCMD=`cat /proc/$PID/status |grep ^Name: |awk '{print $2}'`
     sCMD="[ $sCMD ]"
  fi
  echo -e "$sPID $sPPID $sUID $sGID $sSTAT $sMEM $sTTY $sCMD"
done
簡要介紹,這個lps或列舉系統中自身進程(lps)以外的全部進程,而後讀取和顯示他們的八項屬性,依次是:進程ID(PID) 父進程ID(PPID) 屬主UID(UID) 屬主GID(GID) 當前狀態 佔用內存 運行終端 徹底執行路徑。
在顯示格式參考了Linux標準ps輸出的一部分,例如某些系統線程沒有可執行文件的,就會顯示他們的內核名字,例如[ ksoftirqd_CPU0 ] 。
懶人的PS中沒有任何參數,你也能夠擴展它的功能,使之能支持按照進程樹狀顯示等等。
在我係統上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./lps.sh
PID     PPID    UID     GID     STAT            MEM     TTY     CMD
1       0       0       0       S(sleeping)     1116kB          /sbin/init
101     1       0       0       S(sleeping)     2168kB          /usr/local/sbin/sshd
109     99      99      99      S(sleeping)     6100kB          /usr/local/apache/bin/httpd
110     99      99      99      S(sleeping)     6100kB          /usr/local/apache/bin/httpd
112     99      99      99      S(sleeping)     6100kB          /usr/local/apache/bin/httpd
113     99      99      99      S(sleeping)     6100kB          /usr/local/apache/bin/httpd
116     99      99      99      S(sleeping)     6100kB          /usr/local/apache/bin/httpd
118     1       0       0       S(sleeping)     1656kB          /bin/bash
119     1       0       0       S(sleeping)     1648kB          /bin/bash
120     1       0       0       S(sleeping)     1648kB          /bin/bash
128     1       0       0       S(sleeping)     2224kB  /dev/tty1       /bin/login
1283    3113    0       0       S(sleeping)     1512kB  /dev/ttyp0      /bin/vi
129     1       0       0       S(sleeping)     1136kB  /dev/tty2       /sbin/getty
130     1       0       0       S(sleeping)     1136kB  /dev/tty3       /sbin/getty
131     1       0       0       S(sleeping)     1136kB  /dev/tty4       /sbin/getty
135     1       0       0       S(sleeping)     1136kB  /dev/tty5       /sbin/getty
136     1       0       0       S(sleeping)     1136kB  /dev/tty6       /sbin/getty
137     1       0       0       S(sleeping)     1140kB  /dev/ttyS0      /sbin/getty
15329   3112    0       0       S(sleeping)     1792kB  /dev/ttyp1      /bin/bash
2       1       0       0       S(sleeping)                     [ keventd ]
256     128     0       0       S(sleeping)     1712kB  /dev/tty1       /bin/bash
3       1       0       0       S(sleeping)                     [ ksoftirqd_CPU0 ]
3112    101     0       0       S(sleeping)     2452kB  /dev/ptyp1      /usr/local/sbin/sshd
3113    3112    0       0       S(sleeping)     1728kB  /dev/ttyp0      /bin/bash
3872    120     0       0       S(sleeping)     1084kB          /bin/sleep
4       1       0       0       S(sleeping)                     [ kswapd ]
4       1       0       0       S(sleeping)                     [ kswapd ]
4       1       0       0       S(sleeping)                     [ kswapd ]
4089    15329   0       0       S(sleeping)     1664kB  /dev/ttyp1      /bin/bash
4089    15329   0       0       S(sleeping)     1664kB  /dev/ttyp1      /bin/bash
5       1       0       0       S(sleeping)                     [ bdflush ]
6       1       0       0       S(sleeping)                     [ kupdated ]
99      1       0       0       S(sleeping)     6016kB          /usr/local/apache/bin/httpd
Solaris上有/usr/proc/bin工具集,裏面的ptree和pmap非常好用,甚至比原本的ps還好:P惋惜Linux上是沒有的,如今你能夠本身寫一個,用來綜合顯示更多的進程狀態。
代碼:
#!/bin/bash
#PROC=`mount |grep 'type proc'|awk '{print $3}'`
test $1 || { echo "Usage: pstat.sh PID" && exit };
PID=$1;
echo "Process $1 Status...";
echo "......................";
echo
cat /proc/$PID/status|grep ^Name:
cat /proc/$PID/status|grep ^Pid:
cat /proc/$PID/status|grep ^PPid:
cat /proc/$PID/status|grep ^Uid:
cat /proc/$PID/status|grep ^Gid:
cat /proc/$PID/status|grep ^State:
cat /proc/$PID/status|grep ^VmSize:
echo
CMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*'`;echo "Command path: $CMD";
ARG=`cat /proc/$PID/cmdline`;echo "Command line: $ARG";
CWD=`ls -alF /proc/$PID/cwd |awk '{print $11}'`;echo "CWD: $CWD";
echo
ENVI=`cat /proc/$PID/environ`;echo "ENVIRON: $ENVI";
echo
echo
echo "Process shared object:";
echo "......................";
cat /proc/$PID/maps |grep $CMD |grep xp;
cat /proc/$PID/maps |grep .so |grep xp;
echo
echo
echo "Process used file:";
echo "......................";
ls -alF /proc/$PID/fd |grep '->' |awk '{print $11}' |sort |uniq -c |sort -rn ;
echo
這個程序叫pstat.sh,能夠顯示進程的綜合信息。輸出分爲四段,分別是進程狀態(包含父子進程關係、進程信任狀以及內存佔用),執行環境(包含進程執行程序,命令行參數和環境變量),進程執行對象(包含進程執行體和引用的共享庫),最後是進程打開的 全部文件。
代碼:
[elly@frost.llnl]/tmp# ./pstat.sh
Usage: pstat.sh PID
[elly@frost.llnl]/tmp# ./pstat.sh 7238
Process 7238 Status...
......................
Name:   vi
Pid:    7238
PPid:   3113
Uid:    0       0       0       0
Gid:    0       0       0       0
State:  S (sleeping)
VmSize:     1648 kB
Command path: /bin/vi
Command line: vi
CWD: /usr/
ENVIRON: USERNAME=root
Process shared object:
......................
08048000-08098000 r-xp 00000000 03:01 3891       /bin/vi
40000000-40013000 r-xp 00000000 03:01 3942       /lib/ld-2.1.3.so
40016000-40019000 r-xp 00000000 03:01 4002       /lib/libtermcap.so.2.0.8
4001a000-40107000 r-xp 00000000 03:01 3949       /lib/libc-2.1.3.so
4010f000-40117000 r-xp 00000000 03:01 3981       /lib/libnss_files-2.1.3.so

Process used file:
......................
/dev/ttyp0
/etc/motd ios

相關文章
相關標籤/搜索