Linux基礎命令(3)
- 2020 年 1 月 6 日
- 筆記
十二 lsof命令簡介 lsof(list open files) 是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以 如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後台都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件 描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工 具能夠查看這個列表對系統監測以及排錯將是很有幫助的。 1.命令格式: lsof [參數][文件] 2.命令功能: 用於查看你進程開打的文件,打開文件的進程,進程打開的端口(TCP、UDP)。找回/恢復刪除的文件。是十分方便的系統監視工具,因為 lsof 需要訪問核心內存和各種文件,所以需要root用戶執行。 lsof打開的文件可以是: 1.普通文件 2.目錄 3.網絡文件系統的文件 4.字符或設備文件 5.(函數)共享庫 6.管道,命名管道 7.符號鏈接 8.網絡文件(例如:NFS file、網絡socket,unix域名socket) 9.還有其它類型的文件,等等 3.命令參數: -a 列出打開文件存在的進程 -c<進程名> 列出指定進程所打開的文件 -g 列出GID號進程詳情 -d<文件號> 列出佔用該文件號的進程 +d<目錄> 列出目錄下被打開的文件 +D<目錄> 遞歸列出目錄下被打開的文件 -n<目錄> 列出使用NFS的文件 -i<條件> 列出符合條件的進程。(4、6、協議、:端口、 @ip ) -p<進程號> 列出指定進程號所打開的文件 -u 列出UID號進程詳情 -h 顯示幫助信息 -v 顯示版本信息 4.使用實例: 實例1:無任何參數 命令: lsof 輸出: [root@localhost ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 8,2 4096 2 / init 1 root rtd DIR 8,2 4096 2 / init 1 root txt REG 8,2 43496 6121706 /sbin/init init 1 root mem REG 8,2 143600 7823908 /lib64/ld-2.5.so init 1 root mem REG 8,2 1722304 7823915 /lib64/libc-2.5.so init 1 root mem REG 8,2 23360 7823919 /lib64/libdl-2.5.so init 1 root mem REG 8,2 95464 7824116 /lib64/libselinux.so.1 init 1 root mem REG 8,2 247496 7823947 /lib64/libsepol.so.1 init 1 root 10u FIFO 0,17 1233 /dev/initctl migration 2 root cwd DIR 8,2 4096 2 / migration 2 root rtd DIR 8,2 4096 2 / migration 2 root txt unknown /proc/2/exe ksoftirqd 3 root cwd DIR 8,2 4096 2 / ksoftirqd 3 root rtd DIR 8,2 4096 2 / ksoftirqd 3 root txt unknown /proc/3/exe migration 4 root cwd DIR 8,2 4096 2 / migration 4 root rtd DIR 8,2 4096 2 / migration 4 root txt unknown /proc/4/exe ksoftirqd 5 root cwd DIR 8,2 4096 2 / ksoftirqd 5 root rtd DIR 8,2 4096 2 / ksoftirqd 5 root txt unknown /proc/5/exe events/0 6 root cwd DIR 8,2 4096 2 / events/0 6 root rtd DIR 8,2 4096 2 / events/0 6 root txt unknown /proc/6/exe events/1 7 root cwd DIR 8,2 4096 2 / 說明: lsof輸出各列信息的意義如下: COMMAND:進程的名稱 PID:進程標識符 PPID:父進程標識符(需要指定-R參數) USER:進程所有者 PGID:進程所屬組 FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等 (1)cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改 (2)txt :該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序 (3)lnn:library references (AIX); (4)er:FD information error (see NAME column); (5)jld:jail directory (FreeBSD); (6)ltx:shared library text (code and data); (7)mxx :hex memory-mapped type number xx. (8)m86:DOS Merge mapped file; (9)mem:memory-mapped file; (10)mmap:memory-mapped device; (11)pd:parent directory; (12)rtd:root directory; (13)tr:kernel trace file (OpenBSD); (14)v86 VP/ix mapped file; (15)0:表示標準輸出 (16)1:表示標準輸入 (17)2:表示標準錯誤 一般在標準輸出、標準錯誤、標準輸入後還跟着文件狀態模式:r、w、u等 (1)u:表示該文件被打開並處於讀取/寫入模式 (2)r:表示該文件被打開並處於只讀模式 (3)w:表示該文件被打開並處於 (4)空格:表示該文件的狀態模式為unknow,且沒有鎖定 (5)-:表示該文件的狀態模式為unknow,且被鎖定 同時在文件狀態模式後面,還跟着相關的鎖 (1)N:for a Solaris NFS lock of unknown type; (2)r:for read lock on part of the file; (3)R:for a read lock on the entire file; (4)w:for a write lock on part of the file;(文件的部分寫鎖) (5)W:for a write lock on the entire file;(整個文件的寫鎖) (6)u:for a read and write lock of any length; (7)U:for a lock of unknown type; (8)x:for an SCO OpenServer Xenix lock on part of the file; (9)X:for an SCO OpenServer Xenix lock on the entire file; (10)space:if there is no lock. TYPE:文件類型,如DIR、REG等,常見的文件類型 (1)DIR:表示目錄 (2)CHR:表示字符類型 (3)BLK:塊設備類型 (4)UNIX: UNIX 域套接字 (5)FIFO:先進先出 (FIFO) 隊列 (6)IPv4:網際協議 (IP) 套接字 DEVICE:指定磁盤的名稱 SIZE:文件的大小 NODE:索引節點(文件在磁盤上的標識) NAME:打開文件的確切名稱 實例2:查看誰正在使用某個文件,也就是說查找某個文件相關的進程 命令: lsof /bin/bash 輸出: [root@localhost ~]# lsof /bin/bash COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 24159 root txt REG 8,2 801528 5368780 /bin/bash bash 24909 root txt REG 8,2 801528 5368780 /bin/bash bash 24941 root txt REG 8,2 801528 5368780 /bin/bash 實例3:遞歸查看某個目錄的文件信息 命令: lsof test/test3 輸出: [root@localhost ~]# cd /opt/soft/ [root@localhost soft]# lsof test/test3 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 24941 root cwd DIR 8,2 4096 2258872 test/test3 vi 24976 root cwd DIR 8,2 4096 2258872 test/test3 說明: 使用了+D,對應目錄下的所有子目錄和文件都會被列出 實例4:不使用+D選項,遍歷查看某個目錄的所有文件信息的方法 命令: lsof |grep 'test/test3' 輸出: [root@localhost soft]# lsof |grep 'test/test3' bash 24941 root cwd DIR 8,2 4096 2258872 /opt/soft/test/test3 vi 24976 root cwd DIR 8,2 4096 2258872 /opt/soft/test/test3 vi 24976 root 4u REG 8,2 12288 2258882 /opt/soft/test/test3/.log2013.log.swp 實例5:列出某個用戶打開的文件信息 命令: lsof -u username 說明: -u 選項,u其實是user的縮寫 實例6:列出某個程序進程所打開的文件信息 命令: lsof -c mysql 說明: -c 選項將會列出所有以mysql這個進程開頭的程序的文件,其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字符了 實例7:列出多個進程多個打開的文件信息 命令: lsof -c mysql -c apache 實例8:列出某個用戶以及某個進程所打開的文件信息 命令: lsof -u test -c mysql 說明: 用戶與進程可相關,也可以不相關 實例9:列出除了某個用戶外的被打開的文件信息 命令: lsof -u ^root 說明: ^這個符號在用戶名之前,將會把是root用戶打開的進程不讓顯示 實例10:通過某個進程號顯示該進行打開的文件 命令: lsof -p 1 實例11:列出多個進程號對應的文件信息 命令: lsof -p 1,2,3 實例12:列出除了某個進程號,其他進程號所打開的文件信息 命令: lsof -p ^1 實例13:列出所有的網絡連接 命令: lsof -i 實例14:列出所有tcp 網絡連接信息 命令: lsof -i tcp 實例15:列出所有udp網絡連接信息 命令: lsof -i udp 實例16:列出誰在使用某個端口 命令: lsof -i :3306 實例17:列出誰在使用某個特定的udp端口 命令: lsof -i udp:55 或者:特定的tcp端口 命令: lsof -i tcp:80 實例18:列出某個用戶的所有活躍的網絡端口 命令: lsof -a -u test -i 實例19:列出所有網絡文件系統 命令: lsof -N 實例20:域名socket文件 命令: lsof -u 實例21:某個用戶組所打開的文件信息 命令: lsof -g 5555 實例22:根據文件描述列出對應的文件信息 命令: lsof -d description(like 2) 例如:lsof -d txt 例如:lsof -d 1 例如:lsof -d 2 說明: 0表示標準輸入,1表示標準輸出,2表示標準錯誤,從而可知:所以大多數應用程序所打開的文件的 FD 都是從 3 開始 實例23:根據文件描述範圍列出文件信息 命令: lsof -d 2-3 實例24:列出COMMAND列中包含字符串" sshd",且文件描符的類型為txt的文件信息 命令: lsof -c sshd -a -d txt 輸出: [root@localhost soft]# lsof -c sshd -a -d txt COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 2756 root txt REG 8,2 409488 1027867 /usr/sbin/sshd sshd 24155 root txt REG 8,2 409488 1027867 /usr/sbin/sshd sshd 24905 root txt REG 8,2 409488 1027867 /usr/sbin/sshd sshd 24937 root txt REG 8,2 409488 1027867 /usr/sbin/sshd 實例25:列出被進程號為1234的進程所打開的所有IPV4 network files 命令: lsof -i 4 -a -p 1234 實例26:列出目前連接主機peida.linux上端口為:20,21,22,25,53,80相關的所有文件信息,且每隔3秒不斷的執行lsof指令 命令: lsof -i @peida.linux:20,21,22,25,53,80 -r 3 十三 watch命令簡介 watch是一個非常實用的命令,基本所有的Linux發行版都帶有這個小工具,如同名字一樣,watch可以幫你監測一個命令的運行結果,省得你一遍遍的手動運行。在Linux下,watch是周期性的執行下個程序,並全屏顯示執行結果。你可以拿他來監測你想要的一切命令的結果變化,比如 tail 一個 log 文件,ls 監測某個文件的大小變化,看你的想像力了! 1.命令格式: watch[參數][命令] 2.命令功能: 可以將命令的輸出結果輸出到標準輸出設備,多用於周期性執行命令/定時執行命令 3.命令參數: -n或–interval watch缺省每2秒運行一下程序,可以用-n或-interval來指定間隔的時間。 -d或–differences 用-d或–differences 選項watch 會高亮顯示變化的區域。 而-d=cumulative選項會把變動過的地方(不管最近的那次有沒有變動)都高亮顯示出來。 -t 或-no-title 會關閉watch命令在頂部的時間間隔,命令,當前時間的輸出。 -h, –help 查看幫助文檔 4.使用實例: 實例1:每隔一秒高亮顯示網絡鏈接數的變化情況 命令: watch -n 1 -d netstat –ant 說明: 其它操作: 切換終端: Ctrl+x 退出watch:Ctrl+g 實例2:每隔一秒高亮顯示http鏈接數的變化情況 命令: watch -n 1 -d 'pstree|grep http' 說明: 每隔一秒高亮顯示http鏈接數的變化情況。 後面接的命令若帶有管道符,需要加''將命令區域歸整。 實例3:實時查看模擬***客戶機建立起來的連接數 命令: watch 'netstat -an | grep:21 | grep<模擬***客戶機的IP>| wc -l' 說明: 實例4:監測當前目錄中 scf' 的文件的變化 命令: watch -d 'ls -l|grep scf' 實例5:10秒一次輸出系統的平均負載 命令: watch -n 10 'cat /proc/loadavg' 十四 crond命令簡介 crond 是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務 工具,並且會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。 Linux下的任務調度分為兩類,系統任務調度和用戶任務調度。 系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。 /etc/crontab文件包括下面幾行: [root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=""HOME=/ # run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 前 四行是用來配置crond任務運行的環境變量,第一行SHELL變量指定了系統要使用哪個shell,這裡是bash,第二行PATH變量指定了系統執行 命令的路徑,第三行MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變量的值為空,則表示不發送任務 執行信息給用戶,第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。第六至九行表示的含義將在下個小節詳細講述。這裡不在多說。 用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定製自己的計劃任務。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。 一.使用者權限文件: 文件: /etc/cron.deny 說明: 該文件中所列用戶不允許使用crontab命令 文件: /etc/cron.allow 說明: 該文件中所列用戶允許使用crontab命令 文件: /var/spool/cron/ 說明: 所有用戶crontab文件存放的目錄,以用戶名命名 二.crontab文件的含義: 用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個字段代表一項設置,它的格式共分為六個字段,前五段是時間設定段,第六段是要執行的命令段,格式如下: minute hour day month week command 其中: minute: 表示分鐘,可以是從0到59之間的任何整數。 hour:表示小時,可以是從0到23之間的任何整數。 day:表示日期,可以是從1到31之間的任何整數。 month:表示月份,可以是從1到12之間的任何整數。 week:表示星期幾,可以是從0到7之間的任何整數,這裡的0或7代表星期日。 command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。 在以上各個字段中,還可以使用以下特殊字符: 星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。 逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」 中杠(-):可以用整數之間的中杠表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」 正斜線(/):可以用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執行一次。 三.crond服務 安裝crontab: yum install crontabs 服務操作說明: /sbin/service crond start //啟動服務 /sbin/service crond stop //關閉服務 /sbin/service crond restart //重啟服務 /sbin/service crond reload //重新載入配置 查看crontab服務狀態: service crond status 手動啟動crontab服務: service crond start 查看crontab服務是否已設置為開機啟動,執行命令: ntsysv 加入開機自動啟動: chkconfig –level 35 crond on 四.crontab命令詳解 1.命令格式: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] 2.命令功能: 通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常設合周期性的日誌分析或數據備份等工作。 3.命令參數: -u user:用來設定某個用戶的crontab服務,例如,「-u ixdba」表示設定ixdba用戶的crontab服務,此參數一般有root用戶來運行。 file:file是命令文件的名字,表示將file做為crontab的任務列表文件並載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。 -e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。 -l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。 -r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。 -i:在刪除用戶的crontab文件時給確認提示。 4.常用方法: 1). 創建一個新的crontab文件 在 考慮向cron進程提交一個crontab文件之前,首先要做的一件事情就是設置環境變量EDITOR。cron進程根據它來確定使用哪個編輯器編輯 crontab文件。9 9 %的UNIX和LINUX用戶都使用vi,如果你也是這樣,那麼你就編輯$ HOME目錄下的. profile文件,在其 中加入這樣一行: EDITOR=vi; export EDITOR 然後保存並退出。不妨創建一個名為<user> cron的文件,其中<user>是用戶名,例如, davecron。在該文件中加入如下的內容。 # (put your own initials here)echo the date to the console every # 15minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 保存並退出。確信前面5個域用空格分隔。 在 上面的例子中,系統將每隔1 5分鐘向控制台輸出一次當前時間。如果系統崩潰或掛起,從最後所顯示的時間就可以一眼看出系統是什麼時間停止工作的。在有些 系統中,用tty1來表示控制台,可以根據實際情況對上面的例子進行相應的修改。為了提交你剛剛創建的crontab文件,可以把這個新創建的文件作為 cron命令的參數: $ crontab davecron 現在該文件已經提交給cron進程,它將每隔1 5分鐘運行一次。 同時,新創建文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名(即dave)。 2). 列出crontab文件 為了列出crontab文件,可以用: $ crontab -l 0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1 你將會看到和上面類似的內容。可以使用這種方法在$ H O M E目錄中對crontab文件做一備份: $ crontab -l > $HOME/mycron 這樣,一旦不小心誤刪了crontab文件,可以用上一節所講述的方法迅速恢復。 3). 編輯crontab文件 如果希望添加、刪除或編輯crontab文件中的條目,而E D I TO R環境變量又設置為v i,那麼就可以用v i來編輯crontab文件,相應的命令為: $ crontab -e 可以像使用v i編輯其他任何文件那樣修改crontab文件並退出。如果修改了某些條目或添加了新的條目,那麼在保存該文件時, c r o n會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許範圍的值,它會提示你。 我們在編輯crontab文件時,沒準會加入新的條目。例如,加入下面的一條: # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ; 現在保存並退出。最好在crontab文件的每一個條目之上加入一條注釋,這樣就可以知道它的功能、運行時間,更為重要的是,知道這是哪位用戶的作業。 現在讓我們使用前面講過的crontab -l命令列出它的全部信息: $ crontab -l # (crondave installed on Tue May 4 13:07:43 1999) # DT:ech the date to the console every 30 minites 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1 # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ; 4). 刪除crontab文件 要刪除crontab文件,可以用: $ crontab -r 5). 恢復丟失的crontab文件 如果不小心誤刪了crontab文件,假設你在自己的$ H O M E目錄下還有一個備份,那麼可以將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。如果由於權限問題無法完成拷貝,可以用: $ crontab <filename> 其中,<filename>是你在$ H O M E目錄中副本的文件名。 我建議你在自己的$ H O M E目錄中保存一個該文件的副本。我就有過類似的經歷,有數次誤刪了crontab文件(因為r鍵緊挨在e鍵的右邊)。這就是為什麼有些系統文檔建議不要直接編輯crontab文件,而是編輯該文件的一個副本,然後重新提交新的文件。 有些crontab的變體有些怪異,所以在使用crontab命令時要格外小心。如果遺漏了任何選項,crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按<Ctrl-D>,否則你將丟失crontab文件。 6.使用實例 實例1:每1分鐘執行一次command 命令: * * * * * command 實例2:每小時的第3和第15分鐘執行 命令: 3,15 * * * * command 實例3:在上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 * * * command 實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 */2 * * command 實例5:每個星期一的上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 * * 1 command 實例6:每晚的21:30重啟smb 命令: 30 21 * * * /etc/init.d/smb restart 實例7:每月1、10、22日的4 : 45重啟smb 命令: 45 4 1,10,22 * * /etc/init.d/smb restart 實例8:每周六、周日的1 : 10重啟smb 命令: 10 1 * * 6,0 /etc/init.d/smb restart 實例9:每天18 : 00至23 : 00之間每隔30分鐘重啟smb 命令: 0,30 18-23 * * * /etc/init.d/smb restart 實例10:每星期六的晚上11 : 00 pm重啟smb 命令: 0 23 * * 6 /etc/init.d/smb restart 實例11:每一小時重啟smb 命令: * */1 * * * /etc/init.d/smb restart 實例12:晚上11點到早上7點之間,每隔一小時重啟smb 命令: * 23-7/1 * * * /etc/init.d/smb restart 實例13:每月的4號與每周一到周三的11點重啟smb 命令: 0 11 4 * mon-wed /etc/init.d/smb restart 實例14:一月一號的4點重啟smb 命令: 0 4 1 jan * /etc/init.d/smb restart 實例15:每小時執行/etc/cron.hourly目錄內的腳本 命令: 01 * * * * root run-parts /etc/cron.hourly 說明: run-parts這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是目錄名了 五、使用注意事項 1. 注意環境變量問題 有時我們創建了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由於在crontab文件中沒有配置環境變量引起的。 在 crontab文件中定義多個調度任務時,需要特別注意的一個問題就是環境變量的設置,因為我們手動執行某個任務時,是在當前shell環境下進行的,程 序當然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的,因此,就需要在crontab文件中指定任務運行所需的所有環境變量,這 樣,系統執行任務調度時就沒有問題了。 不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環境變量,除了一些自動設置的全局變量。所以注意如下3點: 1)腳本中涉及文件路徑時寫全局路徑; 2)腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如: cat start_cbp.sh #!/bin/sh source /etc/profile export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf /usr/local/jboss-4.0.5/bin/run.sh -c mev & 3)當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並可以嘗試在crontab中直接引入環境變量解決問題。如: 0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh 2. 注意清理系統用戶的郵件日誌 每條任務調度執行完畢,系統都會將任務輸出信息通過電子郵件的形式發送給當前系統用戶,這樣日積月累,日誌信息會非常大,可能會影響系統的正常運行,因此,將每條任務進行重定向處理非常重要。 例如,可以在crontab文件中設置如下形式,忽略日誌輸出: 0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1 「/dev/null 2>&1」表示先將標準輸出重定向到/dev/null,然後將標準錯誤重定向到標準輸出,由於標準輸出已經重定向到了/dev/null,因此標準錯誤也會重定向到/dev/null,這樣日誌輸出問題就解決了。 3. 系統級任務調度與用戶級任務調度 系 統級任務調度主要完成系統的一些維護操作,用戶級任務調度主要完成用戶自定義的一些任務,可以將用戶級任務調度放到系統級任務調度來完成(不建議這麼 做),但是反過來卻不行,root用戶的任務調度操作可以通過「crontab –uroot –e」來設置,也可以將調度任務直接寫入/etc /crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個 定時重啟系統的任務也是無效的。 4. 其他注意事項 新創建的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。 當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。 千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。 在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義%,如經常用的date 『+%Y%m%d』在crontab里是不會執行的,應該換成date 『+%Y%m%d』。 十五 Vmstat命令簡介 vmstat 是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控。他是對系統的整體 情況進行統計,不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因為 vmstat 本身就是低開銷工具,在非常高負荷的服務器上,你需要查看並監控系統的健康情況,在控制窗口還是能夠使用vmstat 輸出結果。在學習vmstat命令前,我們先了解一下Linux系統中關於物理內存和虛擬內存相關信息。 一.物理內存和虛擬內存區別: 我們知道,直接從物理內存讀寫數據要比從硬盤讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。 物理內存就是系統硬件提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內存,用作虛擬內存的磁盤空間被稱為交換空間(Swap Space)。 作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。 linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。 要深入了解linux內存運行機制,需要知道下面提到的幾個方面: 首先,Linux系統會不時的進行頁面交換操作,以保持儘可能多的空閑物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。 其 次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「算法,僅僅將一些不經常使用的頁面 文件交換到虛擬內存,有時我們會看到這麼一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的 進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被 交換出去的頁面文件並不會自動的交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象 了。關於這點,不用擔心什麼,只要知道是怎麼一回事就可以了。 最 後,交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有 足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可 用了。 因此,合理規劃和設計linux內存的使用,是非常重要的。 二.虛擬內存原理: 在 系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進 程所佔用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。 在Linux內存管理中,主要是通過「調頁Paging」和「交換Swapping」來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁盤上。 分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。 當 系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的 發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作 thrashing(顛簸)。 1.命令格式: vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V] 2.命令功能: 用來顯示虛擬內存的信息 3.命令參數: -a:顯示活躍和非活躍內存 -f:顯示從系統啟動至今的fork數量 。 -m:顯示slabinfo -n:只在開始時顯示一次各字段名稱。 -s:顯示內存相關統計信息及多種系統活動數量。 delay:刷新時間間隔。如果不指定,只顯示一條結果。 count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。 -d:顯示磁盤相關統計信息。 -p:顯示指定磁盤分區統計信息 -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576位元組(byte)。默認單位為K(1024 bytes) -V:顯示vmstat版本信息。 4.使用實例: 實例1:顯示虛擬內存使用情況 命令: vmstat 輸出: [root@localhost ~]# vmstat 5 6 procs ———–memory———- —swap– —–io—- –system– —–cpu—— r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 3029876 199616 690980 0 0 0 2 3 2 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 41 1009 39 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 3 1004 36 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 4 1004 36 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 6 1003 33 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 5 1003 33 0 0 100 0 0 說明: 字段說明: Procs(進程): r: 運行隊列中進程數量 b: 等待IO的進程數量 Memory(內存): swpd: 使用虛擬內存大小 free: 可用內存大小 buff: 用作緩衝的內存大小 cache: 用作緩存的內存大小 Swap: si: 每秒從交換區寫到內存的大小 so: 每秒寫入交換區的內存大小 IO:(現在的Linux版本塊的大小為1024bytes) bi: 每秒讀取的塊數 bo: 每秒寫入的塊數 系統: in: 每秒中斷數,包括時鐘中斷。 cs: 每秒上下文切換數。 CPU(以百分比表示): us: 用戶進程執行時間(user time) sy: 系統進程執行時間(system time) id: 空閑時間(包括IO等待時間),中央處理器的空閑時間 。以百分比表示。 wa: 等待IO時間 備註: 如 果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。如果pi,po 長期不等於0,表示內存不足。如果disk 經常不等於0, 且 在 b中的隊列 大於3, 表示 io性能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調 整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,了解系統性能分析工具是至關重要的。 命令: vmstat 5 5 表示在5秒時間內進行5次採樣。將得到一個數據匯總他能夠反映真正的系統情況。 實例2:顯示活躍和非活躍內存 命令: vmstat -a 2 5 輸出: [root@localhost ~]# vmstat -a 2 5 procs ———–memory———- —swap– —–io—- –system– —–cpu—— r b swpd free inact active si so bi bo in cs us sy id wa st 0 0 0 3029752 387728 513008 0 0 0 2 3 2 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1005 34 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 22 1004 36 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1004 33 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1003 32 0 0 100 0 0 [root@localhost ~]# 說明: 使用-a選項顯示活躍和非活躍內存時,所顯示的內容除增加inact和active外,其他顯示內容與例子1相同。 字段說明: Memory(內存): inact: 非活躍內存大小(當使用-a選項時顯示) active: 活躍的內存大小(當使用-a選項時顯示) 實例3:查看系統已經fork了多少次 命令: vmstat -f 輸出: [root@SCF1129 ~]# vmstat -f 12744849 forks 說明: 這個數據是從/proc/stat中的processes字段里取得的 實例4:查看內存使用的詳細信息 命令: vmstat -s 輸出: [root@localhost ~]# vmstat -s 4043760 total memory 1013884 used memory 513012 active memory 387728 inactive memory 3029876 free memory 199616 buffer memory 690980 swap cache 6096656 total swap 0 used swap 6096656 free swap 83587 non-nice user cpu ticks 132 nice user cpu ticks 278599 system cpu ticks 913344692 idle cpu ticks 814550 IO-wait cpu ticks 10547 IRQ cpu ticks 21261 softirq cpu ticks 0 stolen cpu ticks 310215 pages paged in 14254652 pages paged out 0 pages swapped in 0 pages swapped out 288374745 interrupts 146680577 CPU context switches 1351868832 boot time 367291 forks 說明: 這些信息的分別來自於/proc/meminfo,/proc/stat和/proc/vmstat。 實例5:查看磁盤的讀/寫 命令: vmstat -d 輸出: [root@localhost ~]# vmstat -d disk- ————reads———— ————writes———– —–IO—— total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ram1 0 0 0 0 0 0 0 0 0 0 ram2 0 0 0 0 0 0 0 0 0 0 ram3 0 0 0 0 0 0 0 0 0 0 ram4 0 0 0 0 0 0 0 0 0 0 ram5 0 0 0 0 0 0 0 0 0 0 ram6 0 0 0 0 0 0 0 0 0 0 ram7 0 0 0 0 0 0 0 0 0 0 ram8 0 0 0 0 0 0 0 0 0 0 ram9 0 0 0 0 0 0 0 0 0 0 ram10 0 0 0 0 0 0 0 0 0 0 ram11 0 0 0 0 0 0 0 0 0 0 ram12 0 0 0 0 0 0 0 0 0 0 ram13 0 0 0 0 0 0 0 0 0 0 ram14 0 0 0 0 0 0 0 0 0 0 ram15 0 0 0 0 0 0 0 0 0 0 sda 33381 6455 615407 63224 2068111 1495416 28508288 15990289 0 10491 hdc 0 0 0 0 0 0 0 0 0 0 fd0 0 0 0 0 0 0 0 0 0 0 md0 0 0 0 0 0 0 0 0 0 0 說明: 這些信息主要來自於/proc/diskstats. merged:表示一次來自於合併的寫/讀請求,一般系統會把多個連接/鄰近的讀/寫請求合併到一起來操作. 實例6:查看/dev/sda1磁盤的讀/寫 命令: 輸出: [root@SCF1129 ~]# df 文件系統 1K-塊 已用 可用 已用% 掛載點 /dev/sda3 1119336548 27642068 1034835500 3% /tmpfs 32978376 0 32978376 0% /dev/shm /dev/sda1 1032088 59604 920056 7% /boot [root@SCF1129 ~]# vmstat -p /dev/sda1 sda1 reads read sectors writes requested writes 18607 4249978 6 48[root@SCF1129 ~]# vmstat -p /dev/sda3 sda3 reads read sectors writes requested writes 429350 35176268 28998789 980301488[root@SCF1129 ~]# 說明: 這些信息主要來自於/proc/diskstats。 reads:來自於這個分區的讀的次數。 read sectors:來自於這個分區的讀扇區的次數。 writes:來自於這個分區的寫的次數。 requested writes:來自於這個分區的寫請求次數。 實例7:查看系統的slab信息 命令: vmstat -m 輸出: [root@localhost ~]# vmstat -m Cache Num Total Size Pages ip_conntrack_expect 0 0 136 28 ip_conntrack 3 13 304 13 ip_fib_alias 11 59 64 59 ip_fib_hash 11 59 64 59 AF_VMCI 0 0 960 4 bio_map_info 100 105 1064 7 dm_mpath 0 0 1064 7 jbd_4k 0 0 4096 1 dm_uevent 0 0 2608 3 dm_tio 0 0 24 144 dm_io 0 0 48 77 scsi_cmd_cache 10 10 384 10 sgpool-128 32 32 4096 1 sgpool-64 32 32 2048 2 sgpool-32 32 32 1024 4 sgpool-16 32 32 512 8 sgpool-8 45 45 256 15 scsi_io_context 0 0 112 34 ext3_inode_cache 51080 51105 760 5 ext3_xattr 36 88 88 44 journal_handle 18 144 24 144 journal_head 56 80 96 40 revoke_table 4 202 16 202 revoke_record 0 0 32 112 uhci_urb_priv 0 0 56 67 UNIX 13 33 704 11 flow_cache 0 0 128 30 msi_cache 33 59 64 59 cfq_ioc_pool 14 90 128 30 cfq_pool 12 90 216 18 crq_pool 16 96 80 48 deadline_drq 0 0 80 48 as_arq 0 0 96 40 mqueue_inode_cache 1 4 896 4 isofs_inode_cache 0 0 608 6 hugetlbfs_inode_cache 1 7 576 7 Cache Num Total Size Pages ext2_inode_cache 0 0 720 5 ext2_xattr 0 0 88 44 dnotify_cache 0 0 40 92 dquot 0 0 256 15 eventpoll_pwq 3 53 72 53 eventpoll_epi 3 20 192 20 inotify_event_cache 0 0 40 92 inotify_watch_cache 1 53 72 53 kioctx 0 0 320 12 kiocb 0 0 256 15 fasync_cache 0 0 24 144 shmem_inode_cache 254 290 768 5 posix_timers_cache 0 0 128 30 uid_cache 0 0 128 30 ip_mrt_cache 0 0 128 30 tcp_bind_bucket 3 112 32 112 inet_peer_cache 0 0 128 30 secpath_cache 0 0 64 59 xfrm_dst_cache 0 0 384 10 ip_dst_cache 5 10 384 10 arp_cache 1 15 256 15 RAW 3 5 768 5 UDP 5 10 768 5 tw_sock_TCP 0 0 192 20 request_sock_TCP 0 0 128 30 TCP 4 5 1600 5 blkdev_ioc 14 118 64 59 blkdev_queue 20 30 1576 5 blkdev_requests 13 42 272 14 biovec-256 7 7 4096 1 biovec-128 7 8 2048 2 biovec-64 7 8 1024 4 biovec-16 7 15 256 15 biovec-4 7 59 64 59 biovec-1 23 202 16 202 bio 270 270 128 30 utrace_engine_cache 0 0 64 59 Cache Num Total Size Pages utrace_cache 0 0 64 59 sock_inode_cache 33 48 640 6 skbuff_fclone_cache 7 7 512 7 skbuff_head_cache 319 390 256 15 file_lock_cache 1 22 176 22 Acpi-Operand 4136 4248 64 59 Acpi-ParseExt 0 0 64 59 Acpi-Parse 0 0 40 92 Acpi-State 0 0 80 48 Acpi-Namespace 2871 2912 32 112 delayacct_cache 81 295 64 59 taskstats_cache 4 53 72 53 proc_inode_cache 1427 1440 592 6 sigqueue 0 0 160 24 radix_tree_node 13166 13188 536 7 bdev_cache 23 24 832 4 sysfs_dir_cache 5370 5412 88 44 mnt_cache 26 30 256 15 inode_cache 2009 2009 560 7 dentry_cache 60952 61020 216 18 filp 479 1305 256 15 names_cache 3 3 4096 1 avc_node 14 53 72 53 selinux_inode_security 994 1200 80 48 key_jar 2 20 192 20 idr_layer_cache 74 77 528 7 buffer_head 164045 164800 96 40 mm_struct 51 56 896 4 vm_area_struct 1142 1958 176 22 fs_cache 35 177 64 59 files_cache 36 55 768 5 signal_cache 72 162 832 9 sighand_cache 68 84 2112 3 task_struct 76 80 1888 2 anon_vma 458 864 24 144 pid 83 295 64 59 shared_policy_node 0 0 48 77 Cache Num Total Size Pages numa_policy 37 144 24 144 size-131072(DMA) 0 0 131072 1 size-131072 0 0 131072 1 size-65536(DMA) 0 0 65536 1 size-65536 1 1 65536 1 size-32768(DMA) 0 0 32768 1 size-32768 2 2 32768 1 size-16384(DMA) 0 0 16384 1 size-16384 5 5 16384 1 size-8192(DMA) 0 0 8192 1 size-8192 7 7 8192 1 size-4096(DMA) 0 0 4096 1 size-4096 110 111 4096 1 size-2048(DMA) 0 0 2048 2 size-2048 602 602 2048 2 size-1024(DMA) 0 0 1024 4 size-1024 344 352 1024 4 size-512(DMA) 0 0 512 8 size-512 433 480 512 8 size-256(DMA) 0 0 256 15 size-256 1139 1155 256 15 size-128(DMA) 0 0 128 30 size-64(DMA) 0 0 64 59 size-64 5639 5782 64 59 size-32(DMA) 0 0 32 112 size-128 801 930 128 30 size-32 3005 3024 32 112 kmem_cache 137 137 2688 1 這組信息來自於/proc/slabinfo。 slab:由於內核會有許多小對象,這些對象構造銷毀十分頻繁,比如i-node,dentry,這些對象如果每次構建的時候就向內存要一個頁(4kb),而其實只有幾個位元組,這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何分配小存儲區,而slab可以對小對象進行分配,這樣就不用為每一個對象分配頁框,從而節省了空間,內核對一些小對象創建析構很頻繁,slab對這些小對象進行緩衝,可以重複利用,減少內存分配次數。 十六 free命令簡介 free命令可以顯示Linux系統中空閑的、已用的物理內存及swap內存,及被內核使用的buffer。在Linux系統監控的工具中,free命令是最經常使用的命令之一。 1.命令格式: free [參數] 2.命令功能: free 命令顯示系統使用和空閑的內存情況,包括物理內存、交互區內存(swap)和內核緩衝區內存。共享內存將被忽略 3.命令參數: -b 以Byte為單位顯示內存使用情況。 -k 以KB為單位顯示內存使用情況。 -m 以MB為單位顯示內存使用情況。 -g 以GB為單位顯示內存使用情況。 -o 不顯示緩衝區調節列。 -s<間隔秒數> 持續觀察內存使用狀況。 -t 顯示內存總和列。 -V 顯示版本信息。 4.使用實例: 實例1:顯示內存使用情況 命令: free free -g free -m 輸出: [root@SF1150 service]# free total used free shared buffers cached Mem: 32940112 30841684 2098428 0 4545340 11363424 -/+ buffers/cache: 14932920 18007192 Swap: 32764556 1944984 30819572 [root@SF1150 service]# free -g total used free shared buffers cached Mem: 31 29 2 0 4 10 -/+ buffers/cache: 14 17 Swap: 31 1 29 [root@SF1150 service]# free -m total used free shared buffers cached Mem: 32168 30119 2048 0 4438 11097 -/+ buffers/cache: 14583 17584 Swap: 31996 1899 30097 說明: 下面是對這些數值的解釋: total:總計物理內存的大小。 used:已使用多大。 free:可用有多少。 Shared:多個進程共享的內存總額。 Buffers/cached:磁盤緩存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free:可用有多少。 第四行是交換分區SWAP的,也就是我們通常所說的虛擬內存。 區 別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在於使用的角度來 看,第一行是從OS的角度來看,因為對於OS,buffers/cached 都是屬於被使用,所以他的可用內存是2098428KB,已用內存是 30841684KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. 第三行所指的是從應用程序角度來看,對於應用程序來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。 所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached。 如本機情況的可用內存為: 18007156=2098428KB+4545340KB+11363424KB 接下來解釋什麼時候內存會被交換,以及按什麼方交換。 當可用內存少於額定值的時候,就會開會進行交換.如何看額定值: 命令: cat /proc/meminfo 輸出: [root@SF1150 service]# cat /proc/meminfo MemTotal: 32940112 kB MemFree: 2096700 kB Buffers: 4545340 kB Cached: 11364056 kB SwapCached: 1896080 kB Active: 22739776 kB Inactive: 7427836 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 32940112 kB LowFree: 2096700 kB SwapTotal: 32764556 kB SwapFree: 30819572 kB Dirty: 164 kB Writeback: 0 kB AnonPages: 14153592 kB Mapped: 20748 kB Slab: 590232 kB PageTables: 34200 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 49234612 kB Committed_AS: 23247544 kB VmallocTotal: 34359738367 kB VmallocUsed: 278840 kB VmallocChunk: 34359459371 kB HugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0Hugepagesize: 2048 kB 交換將通過三個途徑來減少系統中使用的物理頁面的個數: 1.減少緩衝與頁面cache的大小, 2.將系統V類型的內存頁面交換出去, 3.換出或者丟棄頁面。(Application 佔用的內存頁,也就是物理內存不足)。 事實上,少量地使用swap是不是影響到系統性能的。 那buffers和cached都是緩存,兩者有什麼區別呢? 為 了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採取了兩種 主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短 了 I/O系統調用(比如read,write,getdents)的時間。 磁盤的操作有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。 Page cache 實際上是針對文件系統的,是文件的緩存,在文件層面上的數據會緩存到page cache。文件的邏輯層需要映射到實際的物理磁盤,這種映射關係由文件系 統來完成。當page cache的數據需要刷新時,page cache中的數據交給buffer cache,因為Buffer Cache就是緩存 磁盤塊的。但是這種處理在2.6版本的內核之後就變的很簡單了,沒有真正意義上的cache操作。 Buffer cache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤進行操作的數據會緩存到buffer cache中,例如,文件系統的元數據都會緩存到buffer cache中。 簡單說來,page cache用來緩存文件數據,buffer cache用來緩存磁盤數據。在有文件系統的情況下,對文件操作,那麼數據會緩存到page cache,如果直接採用dd等工具對磁盤進行讀寫,那麼數據會緩存到buffer cache。 所以我們看linux,只要不用swap的交換空間,就不用擔心自己的內存太少.如果常常swap用很多,可能你就要考慮加物理內存了.這也是linux看內存是否夠用的標準. 如果是應用服務器的話,一般只看第二行,+buffers/cache,即對應用程序來說free的內存太少了,也是該考慮優化程序或加內存了。 實例2:以總和的形式顯示內存的使用信息 命令: free -t 輸出: [root@SF1150 service]# free -t total used free shared buffers cached Mem: 32940112 30845024 2095088 0 4545340 11364324 -/+ buffers/cache: 14935360 18004752Swap: 32764556 1944984 30819572Total: 65704668 32790008 32914660 說明: 實例3:周期性的查詢內存使用信息 命令: free -s 10 輸出: [root@SF1150 service]# free -s 10 total used free shared buffers cached Mem: 32940112 30844528 2095584 0 4545340 11364380 -/+ buffers/cache: 14934808 18005304Swap: 32764556 1944984 30819572 total used free shared buffers cached Mem: 32940112 30843932 2096180 0 4545340 11364388 -/+ buffers/cache: 14934204 18005908Swap: 32764556 1944984 30819572 說明: 每10s 執行一次命令 十七 top 命令簡介 top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。下面詳細介紹它的使用方法。top是 一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前台執行該命令,它將獨佔前台,直到用戶終止該程序為止.比較準確的說,top命令提供 了實時的對系統處理器的狀態監視.它將顯示系統中CPU最「敏感」的任務列表.該命令可以按CPU使用.內存使用和執行時間對任務進行排序;而且該命令的 很多特性都可以通過交互式命令或者在個人定製文件中進行設定. 1.命令格式: top [參數] 2.命令功能: 顯示當前系統正在執行的進程的相關信息,包括進程ID、內存佔用率、CPU佔用率等 3.命令參數: -b 批處理 -c 顯示完整的治命令 -I 忽略失效過程 -s 保密模式 -S 累積模式 -i<時間> 設置間隔時間 -u<用戶名> 指定用戶名 -p<進程號> 指定進程 -n<次數> 循環顯示的次數 4.使用實例: 實例1:顯示進程信息 命令: top 輸出: [root@TG1704 log]# top top – 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35 Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java 18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java 2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java 25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java 574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java 1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java 1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java 13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java 28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top 29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java 1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init 2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1 6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2 9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2 10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2 11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3 12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3 13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3 14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4 15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4 16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4 17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5 18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5 19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5 20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6 21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6 22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6 23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7 說明: 統計信息區: 前五行是當前系統情況整體的統計信息區。下面我們看每一行信息的具體意義。 第一行,任務隊列信息,同 uptime 命令的執行結果,具體參數說明情況如下: 14:06:23 — 當前系統時間 up 70 days, 16:44 — 系統已經運行了70天16小時44分鐘(在這期間系統沒有重啟過的吆!) 2 users — 當前有2個用戶登錄系統 load average: 1.15, 1.42, 1.44 — load average後面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況。 load average數據是每隔5秒鐘檢查一次活躍的進程數,然後按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。 第二行,Tasks — 任務(進程),具體信息說明如下: 系統現在共有206個進程,其中處於運行中的有1個,205個在休眠(sleep),stoped狀態的有0個,zombie狀態(殭屍)的有0個。 第三行,cpu狀態信息,具體屬性說明如下: 5.9%us — 用戶空間佔用CPU的百分比。 3.4% sy — 內核空間佔用CPU的百分比。 0.0% ni — 改變過優先級的進程佔用CPU的百分比 90.4% id — 空閑CPU百分比 0.0% wa — IO等待佔用CPU的百分比 0.0% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比 0.2% si — 軟中斷(Software Interrupts)佔用CPU的百分比 備註:在這裡CPU的使用比率和windows概念不同,需要理解linux系統用戶空間和內核空間的相關知識! 第四行,內存狀態,具體信息如下: 32949016k total — 物理內存總量(32GB) 14411180k used — 使用中的內存總量(14GB) 18537836k free — 空閑內存總量(18GB) 169884k buffers — 緩存的內存量 (169M) 第五行,swap交換分區信息,具體信息說明如下: 32764556k total — 交換區總量(32GB) 0k used — 使用的交換區總量(0K) 32764556k free — 空閑交換區總量(32GB) 3612636k cached — 緩衝的交換區總量(3.6GB) 備註: 第 四行中使用中的內存總量(used)指的是現在系統內核控制的內存數,空閑內存總量(free)是內核還未納入其管控範圍的數量。納入內核管理的內存不見 得都在使用中,還包括過去使用過的現在可以被重複利用的內存,內核並不把這些可被重新使用的內存交還到free中去,因此在linux上free內存會越 來越少,但不用為此擔心。 如果出於習慣去計算可用內存數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此台服務器的可用內存:18537836k +169884k +3612636k = 22GB左右。 對於內存監控,在top里我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是真正的內存不夠用了。 第六行,空行。 第七行以下:各進程(任務)的狀態監控,項目列信息說明如下: PID — 進程id USER — 進程所有者 PR — 進程優先級 NI — nice值。負值表示高優先級,正值表示低優先級 VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA SHR — 共享內存大小,單位kb S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=殭屍進程 %CPU — 上次更新到現在的CPU時間佔用百分比 %MEM — 進程使用的物理內存百分比 TIME+ — 進程使用的CPU時間總計,單位1/100秒 COMMAND — 進程名稱(命令名/命令行) 其他使用技巧: 1.多U多核CPU監控 在top基本視圖中,按鍵盤數字「1」,可監控每個邏輯CPU的狀況: 觀察上圖,服務器有16個邏輯CPU,實際上是4個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。 2.高亮顯示當前運行進程 敲擊鍵盤「b」(打開/關閉加亮效果),top的視圖變化如下: 我們發現進程id為2570的「top」進程被加亮了,top進程就是視圖第二行顯示的唯一的運行態(runing)的那個進程,可以通過敲擊「y」鍵關閉或打開運行態進程的加亮效果。 3.進程字段排序 默認進入top時,各進程是按照CPU的佔用量來排序的,在下圖中進程ID為28894的java進程排在第一(cpu佔用142%),進程ID為574的java進程排在第二(cpu佔用16%)。 敲擊鍵盤「x」(打開/關閉排序列的加亮效果),top的視圖變化如下: 可以看到,top默認的排序列是「%CPU」。 4. 通過」shift + >」或」shift + <」可以向右或左改變排序列 下圖是按一次」shift + >」的效果圖,視圖現在已經按照%MEM來排序。 實例2:顯示 完整命令 命令: top -c 輸出: 說明: 實例3:以批處理模式顯示程序信息 命令: top -b 輸出: 說明: 實例4:以累積模式顯示程序信息 命令: top -S 輸出: 說明: 實例5:設置信息更新次數 命令: top -n 2 輸出: 說明: 表示更新兩次後終止更新顯示 實例6:設置信息更新時間 命令: top -d 3 輸出: 說明: 表示更新周期為3秒 實例7:顯示指定的進程信息 命令: top -p 574 輸出: 說明: 5.top交互命令 在top 命令執行過程中可以使用的一些交互命令。這些命令都是單字母的,如果在命令行中使用了s 選項, 其中一些命令可能會被屏蔽。 h 顯示幫助畫面,給出一些簡短的命令總結說明 k 終止一個進程。 i 忽略閑置和僵死進程。這是一個開關式命令。 q 退出程序 r 重新安排一個進程的優先級別 S 切換到累計模式 s 改變兩次刷新之間的延遲時間(單位為s),如果有小數,就換算成m s。輸入0值則系統將不斷刷新,默認值是5 s f或者F 從當前顯示中添加或者刪除項目 o或者O 改變顯示項目的順序 l 切換顯示平均負載和啟動時間信息 m 切換顯示內存信息 t 切換顯示進程和CPU狀態信息 c 切換顯示命令名稱和完整命令行 M 根據駐留內存大小進行排序 P 根據CPU使用百分比大小進行排序 T 根據時間/累計時間進行排序 W 將當前設置寫入~/.toprc文件中 十八 killall 命令簡介 Linux 系統中的killall命令用於殺死指定名字的進程(kill processes by name)。我們可以使用kill命令殺死指定進程PID的進 程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二為一,是一個很好用的命 令。 1.命令格式: killall[參數][進程名] 2.命令功能: 用來結束同名的的所有進程 3.命令參數: -Z 只殺死擁有scontext 的進程 -e 要求匹配進程名稱 -I 忽略小寫 -g 殺死進程組而不是進程 -i 交互模式,殺死進程前先詢問用戶 -l 列出所有的已知信號名稱 -q 不輸出警告信息 -s 發送指定的信號 -v 報告信號是否成功發送 -w 等待進程死亡 –help 顯示幫助信息 –version 顯示版本顯示 4.使用實例: 實例1:殺死所有同名進程 命令: killall vi 輸出: [root@localhost ~]# ps -ef|grep vi root 17581 17398 0 17:51 pts/0 00:00:00 vi test.txt root 17611 17582 0 17:51 pts/1 00:00:00 grep vi [root@localhost ~]# ps -ef|grep vi root 17581 17398 0 17:51 pts/0 00:00:00 vi test.txt root 17640 17612 0 17:51 pts/2 00:00:00 vi test.log root 17642 17582 0 17:51 pts/1 00:00:00 grep vi [root@localhost ~]# killall vi [root@localhost ~]# ps -ef|grep vi root 17645 17582 0 17:52 pts/1 00:00:00 grep vi 實例2:向進程發送指定信號 命令: 後台運行程序:vi & 殺死 vi進程:killall -TERM vi 或者 killall -KILL vi 輸出: [root@localhost ~]# vi & [1] 17646[root@localhost ~]# killall -TERM vi [1]+ Stopped vi [root@localhost ~]# vi & [2] 17648[root@localhost ~]# ps -ef|grep vi root 17646 17582 0 17:54 pts/1 00:00:00 vi root 17648 17582 0 17:54 pts/1 00:00:00 vi root 17650 17582 0 17:55 pts/1 00:00:00 grep vi [2]+ Stopped vi [root@localhost ~]# killall -TERM vi [root@localhost ~]# ps -ef|grep vi root 17646 17582 0 17:54 pts/1 00:00:00 vi root 17648 17582 0 17:54 pts/1 00:00:00 vi root 17653 17582 0 17:55 pts/1 00:00:00 grep vi [root@localhost ~]# killall -KILL vi [1]- 已殺死 vi [2]+ 已殺死 vi [root@localhost ~]# ps -ef|grep vi root 17656 17582 0 17:56 pts/1 00:00:00 grep vi 實例3:把所有的登錄後的shell給殺掉 命令: killall -9 bash 輸出: [root@localhost ~]# w 18:01:03 up 41 days, 18:53, 3 users, load average: 0.00, 0.00, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.2.0.68 14:58 9:52 0.10s 0.10s -bash root pts/1 10.2.0.68 17:51 0.00s 0.02s 0.00s w root pts/2 10.2.0.68 17:51 9:24 0.01s 0.01s -bash [root@localhost ~]# killall -9 bash [root@localhost ~]# w 18:01:48 up 41 days, 18:54, 1 user, load average: 0.07, 0.02, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.2.0.68 18:01 0.00s 0.01s 0.00s w 說明: 運行命令:killall -9 bash 後,所有bash都會被卡掉了,所以當前所有連接丟失了。需要重新連接並登錄。