簡單歸納 : fd 只是一個整數(shù),在 open 時產(chǎn)生。起到一個索引的作用,進(jìn)程通過 PCB 中的 文件描述符表 找到該 fd 所指向的文件指針 filp 。
成都創(chuàng)新互聯(lián)是專業(yè)的九臺網(wǎng)站建設(shè)公司,九臺接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行九臺網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
lsof命令用于查看你進(jìn)程打開的文件、打開文件的進(jìn)程、進(jìn)程打開的端口。找回/恢復(fù)刪除的文件。是十分方便的系統(tǒng)監(jiān)視工具,因為lsof命令需要訪問核心內(nèi)存和各種文件,所以需要root用戶執(zhí)行。
在Linux環(huán)境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規(guī)數(shù)據(jù),還可以訪問網(wǎng)絡(luò)連接和硬件。所以如傳輸控制協(xié)議和用戶數(shù)據(jù)協(xié)議套接字等,系統(tǒng)在后臺都為該應(yīng)用程序分配了一個文件描述符,無論這個文件的本質(zhì)如何,該文件描述符為應(yīng)用程序與基礎(chǔ)操作系統(tǒng)之間的交互提供了通用接口。因為應(yīng)用程序打開文件的描述符列表提供了大量關(guān)于這個應(yīng)用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統(tǒng)監(jiān)測以及排錯將是很有幫助的。
語法:
losf (選項)
選項:
-a 列出打開文件存在的進(jìn)程;
-c進(jìn)程名 列出指定進(jìn)程所打開的文件;
-g 列出GID號進(jìn)程詳情;
-d文件名 列出占用該文件號的進(jìn)程;
+d目錄 列出目錄下被打開的文件;
+D目錄 遞歸列出目錄下被打開的文件;
-n目錄 列出使用NFS的文件;
-i條件 列出符合條件的進(jìn)程。
Linux系統(tǒng)在使用光盤、軟盤或U盤時,必須先執(zhí)行掛載(mount)命令。掛載命令會將這些存儲介質(zhì)指定成系統(tǒng)中的某個目錄,以后直接訪問相應(yīng)目錄即可讀寫存儲介質(zhì)上的數(shù)據(jù)。 \x0d\x0a1、掛載光盤,掛載光盤的命令如下:# mount -t is09660 /dev/cdrom /mnt/cdrom \x0d\x0a該命令將光盤掛載到/mnt/cdrom目錄,使用“l(fā)s /mnt/cdrom”命令即可顯示光盤中數(shù)據(jù)和文件。卸載光盤的命令如下:# umount /mnt/cdrom\x0d\x0a2、掛載軟盤,將軟盤掛載到/mnt/floppy目錄的命令如下:# mount /dev/fd0 /mnt/floppy卸載軟盤的命令如下:#umount /mnt/floppy\x0d\x0a3、掛載U盤掛載U盤相對復(fù)雜一些。首先使用“fdisk -l”命令查看外掛閃存的設(shè)備號,一般為/dev/sda1。然后用“mkdir \x0d\x0a/mnt/usb”命令建立一個掛載U盤用的目錄。之后使用如下命令掛載FAT格式的U盤:# mount -t msdos /dev/sda1 /mnt/usb\x0d\x0a使用如下命令掛載FAT32格式的U盤:# mount -t vfat /dev/sda1 /mnt/usb\x0d\x0a4、掛載外掛硬盤分區(qū),掛載外掛硬盤分區(qū)(FAT32格式)同樣需要先用“fdisk \x0d\x0a-1”查看外掛的硬盤分區(qū)設(shè)備號,假設(shè)為/dev/hda1。建立/mnt/vfat掛載目錄后,使用如下命令進(jìn)行掛載:# mount -t vfat /dev/hda1 /mnt/vfat\x0d\x0a注意,默認(rèn)情況下Linux只允許root用戶執(zhí)行mount命令。如果想讓一般用戶也能掛載,并且希望在系統(tǒng)啟動時自動掛載光盤或軟盤,需要修改/etc/fstab配置文件,加入以下內(nèi)容: LABEL=/ / ext3 defaults11\x0d\x0a/dev/cdrom/mnt/cdrom iSo9660 auto,owner,kudzu,ro,user 00\x0d\x0a/dev/fdo /mnt/floppy auto auto,owner,kudzu,ro,user 00 其中,“user”表示將mount命令賦予一般用戶使用。
在Linux下一切資源皆文件,普通文件是文件,磁盤打印機(jī)是文件,socket 當(dāng)然也是文件。
關(guān)于Linux下系統(tǒng),進(jìn)程能最大能打開的文件描述符數(shù)看過好多文章,但大都沒有完整,詳細(xì)說明每個值表示什么意思,在實踐中該怎么設(shè)置?
如何通過最簡單的設(shè)置來實現(xiàn)最有效的性能調(diào)優(yōu),如何在有限資源的條件下保證程序的運作?
max-file 表示系統(tǒng)級別的能夠打開的文件句柄的數(shù)量,是對整個系統(tǒng)的限制,并不是針對用戶的。
ulimit -n 控制進(jìn)程級別能夠打開的文件句柄的數(shù)量,提供對shell及其啟動的進(jìn)程的可用文件句柄的控制,這是進(jìn)程級別的。
對于服務(wù)器來說,file-max和ulimit都需要設(shè)置,否則會出現(xiàn)文件描述符耗盡的問題。
一般如果遇到文件句柄達(dá)到上限時,會碰到"Too many open files"或者Socket/File: Can’t open so many files等錯誤。
相關(guān)的3個文件:
/proc/sys/fs/file-max
/proc/sys/fs/file-nr
/etc/security/limits.conf
/proc/sys/fs/file-max
Linux系統(tǒng)級別限制所有用戶進(jìn)程能打開的文件描述符總數(shù)。
max-file 表示系統(tǒng)級別的能夠打開的文件句柄的數(shù)量,是對整個系統(tǒng)的限制,并不是針對用戶的。
/etc/security/limits.conf
用戶級別的限制是通過可以通過命令ulimit命令和文件/etc/security/limits.conf
/proc/sys/fs/file-nr 該參數(shù)是只讀的,不能修改。
file-nr的值由3部分組成:
1,已經(jīng)分配的文件描述符數(shù);
2,已經(jīng)分配但未使用的文件描述符數(shù);
3,內(nèi)核最大能分配的文件描述符數(shù)
/proc/${pid}/fd
眾所周知,在相應(yīng)進(jìn)程的/proc/$pid/fd 目錄下存放了此進(jìn)程所有打開的fd。
當(dāng)然有些可能不是本進(jìn)程自己打開的,如通過fork()從父進(jìn)程繼承而來的。
那么這個socket:后面的一串?dāng)?shù)字是什么呢?其實是該socket的inode號。
那么,知道了某個進(jìn)程打開的socket的inode號后,我們可以做什么呢?
這就涉及到/proc/net/tcp(udp對應(yīng)/proc/net/udp)文件了,其中也列出了相應(yīng)socket的inode號通過比對此字段,我們能在/proc/net/tcp下獲得此套接口的其他信息,如對應(yīng)的本地地址:端口號,遠(yuǎn)端地址:端口號對,窗口大小,狀態(tài)等信息。
具體字段含義詳見net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函數(shù)。
如果socket創(chuàng)建了,沒有被使用,那么就只會在/proc/pid/fd下面有,而不會在/proc/net/下面有相關(guān)數(shù)據(jù)。
目錄中的每一項都是一個符號鏈接,指向打開的文件,數(shù)字則代表文件描述符。
其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。
Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?
Linux中最大文件描述符數(shù)
How do linux file descriptor limits work?
limits.conf(5) - Linux man page
Why can't I tail -f /proc/$pid/fd/1 ?
Linux查看進(jìn)程運行輸出(/proc/<pid>/fd)