高级 Linux 命令精通指南(2)
xargs
大多數(shù) Linux 命令都會(huì)產(chǎn)生輸出:文件列表、字符串列表等。但如果要使用其他某個(gè)命令并將前一個(gè)命令的輸出作為參數(shù)該怎么辦?例如,file?命令顯示文件類型(可執(zhí)行文件、ascii 文本等);您可以處理輸出,使其僅顯示文件名,現(xiàn)在您希望將這些名稱傳遞給?ls -l?命令以查看時(shí)間戳記。xargs?命令就是用來完成此項(xiàng)工作的。它允許您對輸出執(zhí)行其他某些命令。記住下面這個(gè)來自于第 1 部分中的語法:
file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr
讓我們來剖析這個(gè)命令字符串。第一個(gè),file -Lz *,用于查找是符號(hào)鏈接或者經(jīng)過壓縮的文件。它將輸出傳遞給下一個(gè)命令?grep ASCII,該命令在其中搜索 "ASCII" 字符串并產(chǎn)生如下所示的輸出:
alert_DBA102.log: ASCII English text
alert_DBA102.log.Z: ASCII text (compress'd data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)
由于我們只對文件名感興趣,因此我們應(yīng)用下一個(gè)命令?cut -d":" -f1,僅顯示第一個(gè)字段:
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z
現(xiàn)在,我們希望使用?ls -l?命令,將上述列表作為參數(shù)進(jìn)行傳遞,一次傳遞一個(gè)。xargs?命令允許您這樣做。最后一部分,xargs ls -ltr,用于接收輸出并對其執(zhí)行?ls -ltr?命令,如下所示:
ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z
因此,xargs?本身雖然沒有多大用處,但在與其他命令相結(jié)合時(shí),它的功能非常強(qiáng)大。
下面是另一個(gè)示例,我們希望計(jì)算這些文件中的行數(shù):
$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l
47853 alert_DBA102.log
19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
154 dba102_reco_14491.trc
43 dba102_rvwr_14518.trc
77122 total
(注:上述任務(wù)還可用以下命令完成:)
$ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘
該?xargs?版本用于闡釋概念。Linux 可以用幾種方法來完成同一個(gè)任務(wù);請使用最適合您的情況的方法。
使用該方法,您可以快速重命名目錄中的文件。
$ ls | xargs -t -i mv {} {}.bak
-i 選項(xiàng)告訴?xargs?用每項(xiàng)的名稱替換 {}。-t 選項(xiàng)指示?xargs?先打印命令,然后再執(zhí)行。
另一個(gè)非常有用的操作是當(dāng)您使用 vi 打開要編輯的文件時(shí):
$ file * | grep ASCII | cut -d":" -f1 | xargs vi
該命令使用 vi 逐個(gè)打開文件。當(dāng)您希望搜索多個(gè)文件并打開它們進(jìn)行編輯時(shí),使用該命令非常方便。
它還有幾個(gè)選項(xiàng)。最有用的可能是 -p 選項(xiàng),它使操作具有可交互性:
$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc
dba102_reco_14491.trc dba102_rvwr_14518.trc ?...
此處的?xarg?要求您在運(yùn)行每個(gè)命令之前進(jìn)行確認(rèn)。如果您按下 "y",則執(zhí)行命令。當(dāng)您對文件進(jìn)行某些可能有破壞且不可恢復(fù)的操作(如刪除或覆蓋)時(shí),您會(huì)發(fā)現(xiàn)該選項(xiàng)非常有用。
-t 選項(xiàng)使用一個(gè)詳細(xì)模式;它顯示要運(yùn)行的命令,是調(diào)試過程中一個(gè)非常有幫助的選項(xiàng)。
如果傳遞給?xargs?的輸出為空怎么辦?考慮以下命令:
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l
wc -l
0
$
在此處,搜索 "SSSSSS" 后沒有匹配的內(nèi)容;因此 xargs 的輸入均為空,如第二行所示(由于我們使用 -t 這個(gè)詳細(xì)選項(xiàng)而產(chǎn)生的結(jié)果)。雖然這可能會(huì)有所幫助,但在某些情況下,如果沒有要處理的內(nèi)容,您可能希望停止?xargs;如果是這樣,可以使用 -r 選項(xiàng):
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l
$
如果沒有要運(yùn)行的內(nèi)容,該命令退出。
假設(shè)您希望使用?rm?命令(該命令將作為?xargs?命令的參數(shù))刪除文件。然而,rm?只能接受有限數(shù)量的參數(shù)。如果您的參數(shù)列表超出該限制怎么辦?xargs 的 -n 選項(xiàng)限制單個(gè)命令行的參數(shù)個(gè)數(shù)。
下面顯示了如何限制每個(gè)命令行僅使用兩個(gè)參數(shù):即使向?xargs ls -ltr?傳遞五個(gè)文件,但每次向?ls -ltr?僅傳遞兩個(gè)文件。
$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc
使用該方法,您可以快速重命名目錄中的文件。
$ ls | xargs -t -i mv {} {}.bak
-i 選項(xiàng)告訴?xargs?用每項(xiàng)的名稱替換 {}。
rename
正如您所知道的那樣,mv?命令對文件進(jìn)行重命名。例如,
$ mv oldname newname
將 oldname 文件重命名為 newname。但如果您不知道文件名,那該怎么辦?rename?命令在此處就可以大顯身手了。
rename .log .log.‘date +%F-%H:%M:%S‘ *
用 .log.<日期格式> 替換所有擴(kuò)展名為 .log 的文件。因此,sqlnet.log 變?yōu)?sqlnet.log.2006-09-12-23:26:28。
find
最受 Oracle 用戶歡迎的命令之一是?find?命令。到目前為止,您了解了如何使用?find?在給定目錄中查找文件。下面的示例顯示在當(dāng)前目錄中查找以單詞 "file" 開頭的文件:
$ find . -name "file*"
./file2
./file1
./file3
./file4
然而,如果您希望搜索 FILE1、FILE2 等名稱怎么辦?-name "file*" 不會(huì)與之匹配。對于區(qū)分大小寫的搜索,可以使用 -iname 選項(xiàng):
$ find . -iname "file*"
./file2
./file1
./file3
./file4
./FILE1
./FILE2
您可以限制搜索范圍,僅搜索特定類型的文件。例如,上述命令將獲得所有類型的文件:普通文件、目錄、符號(hào)鏈接等。如果僅搜索普通文件,可使用 -type f 參數(shù)。
$ find . -name "orapw*" -type f
./orapw+ASM
./orapwDBA102
./orapwRMANTEST
./orapwRMANDUP
./orapwTESTAUX
-type 可以接受修飾符 f(普通文件)、l(符號(hào)鏈接)、d(目錄)、b(塊設(shè)備)、p(命名管道)、c(字符設(shè)備)、s(套接字)。
對上述命令的一個(gè)小技巧是,將其與您在第 1 部分中學(xué)到的?file?命令相結(jié)合。file?命令告訴您文件的類型。您可以將其作為?find?命令的輸出的后處理器進(jìn)行傳遞。-exec 參數(shù)執(zhí)行該參數(shù)后面的命令。在該示例中,在?find?后執(zhí)行的命令是?file:
$ find . -name "*oraenv*" -type f -exec file {} \;
./coraenv: Bourne shell script text executable
./oraenv: Bourne shell script text executable
當(dāng)您希望弄清楚 ASCII 文本文件是否可能是某種類型的 shell 腳本時(shí),該命令非常有用。
如果您用 -ok 替換 -exec,則執(zhí)行該命令之前要求您先進(jìn)行確認(rèn)。下面就是一個(gè)例子:
$ find . -name "sqlplus*" -ok {} \;
< {} ... ./sqlplus > ? y
SQL*Plus: Release 9.2.0.5.0 - Production on Sun Aug 6 11:28:15 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Enter user-name: / as sysdba
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production
< è* ... ./sqlplusO > ? n
$
在此示例中,我們要求 shell 查找所有以 "sqlplus" 開頭的程序并執(zhí)行它們。注意,-ok 與 {} 之間什么都沒有,因此僅執(zhí)行找到的文件。shell 找到兩個(gè)文件 — sqlplus 和 sqlplusO — 并在每次找到后詢問您是否希望執(zhí)行文件。我們針對 "sqlplus" 回答 "y",因此執(zhí)行該文件。退出之后,shell 提示您找到了第二個(gè)文件 (sqlplusO),再次要求您確認(rèn),我們回答 "n",因此不執(zhí)行該文件。
<!-- Tips Box start -->
適用于 Oracle 用戶的技巧
Oracle 產(chǎn)生許多不必要的文件:跟蹤文件、日志文件、轉(zhuǎn)儲(chǔ)文件等。如果不定期清理,這些文件就會(huì)占滿文件系統(tǒng),從而導(dǎo)致數(shù)據(jù)庫暫停。
為了避免出現(xiàn)這種情況,只需搜索擴(kuò)展名為 "trc" 的文件,如果這些文件的存在時(shí)間超過三天,則將其刪除。一個(gè)簡單的命令即可實(shí)現(xiàn)該操作:
find . -name "*.trc" -ctime +3 -exec rm {} \;要強(qiáng)制刪除存在不到三天的文件,請使用 -f 選項(xiàng)。
find . -name "*.trc" -ctime +3 -exec rm -f {} \;
如果只想列出文件:
find . -name "*.trc" -ctime +3 -exec ls -l {} \;<!-- Tips Box end -->
m4
該命令接受一個(gè)輸入文件并用所傳遞的參數(shù)替換其中的字符串,類似于替換變量。例如,以下是一個(gè)輸入文件:
$ cat temp
The COLOR fox jumped over the TYPE fence.
如果要用 "brown" 替換字符串 "COLOR",用 "broken" 替換 "TYPE",您可以使用以下命令:
$ m4 -DCOLOR=brown -DTYPE=broken temp
The brown fox jumped over the broken fence.
Else, if you want to substitute "white" and "high" for the same:
$ m4 -DCOLOR=white -DTYPE=high temp
The white fox jumped over the high fence.
whence 和 which
這兩個(gè)命令用于找到所提到的可執(zhí)行文件在用戶路徑中的存儲(chǔ)位置。在路徑中找到可執(zhí)行文件之后,這兩個(gè)命令的行為基本相同,都顯示文件的路徑:
$ which sqlplus
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus
$ whence sqlplus
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus
輸出完全相同。然而,如果在路徑中未找到可執(zhí)行文件,則兩者的行為不同。which?命令生成一條顯式消息:
$ which sqlplus1
/usr/bin/which: no sqlplus1 in (/u02/app/oracle/products/10.2.0.1/db1/bin:/usr
/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin)
whence?命令不生成任何消息:
$ whence sqlplus1]
而是返回到 shell 提示符。如果在路徑中未找到可執(zhí)行文件,這將很有幫助(不顯示消息):
$ whence invalid_command
$ which invalid_command
which: no invalid_command in (/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:
/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:
/usr/bin/X11:/usr/X11R6/bin:/root/bin)
如果?whence?在路徑中未找到可執(zhí)行文件,它不返回任何消息,但返回代碼不為零。在 shell 腳本中可以利用這個(gè)事實(shí);例如:
RC=‘whence myexec‘
If [ $RC -ne "0" ]; then
echo "myexec is not in the $PATH"
fi
它的一個(gè)非常有用的選項(xiàng)是 -i 選項(xiàng),該選項(xiàng)顯示別名以及可執(zhí)行文件(如果有的話)。例如,您在本文開始部分了解了別名的用法。rm?命令實(shí)際上是我的 shell 中的一個(gè)別名,系統(tǒng)中某處也有一個(gè)?rm?命令。
$ which ls
/bin/ls
$ which -i ls
alias ls='ls --color=tty'
/bin/ls
其默認(rèn)行為是顯示可執(zhí)行文件在路徑中的首次出現(xiàn)。如果可執(zhí)行文件位于路徑的多個(gè)目錄中,則忽略其后的出現(xiàn)。您可以通過 -a 選項(xiàng)查看可執(zhí)行文件的所有出現(xiàn)位置。
$ which java
/usr/bin/java
$ which -a java
/usr/bin/java
/home/oracle/oracle/product/11.1/db_1/jdk/jre/bin/java
top
top?命令可能是 Oracle DBA 在 Linux 上管理數(shù)據(jù)庫時(shí)最有用的命令。如果系統(tǒng)很慢,您可能希望查看誰在占用所有 CPU 和/或內(nèi)存。要顯示最大進(jìn)程,可以使用?top?命令。
注意,與其他命令不同,top?不會(huì)產(chǎn)生輸出,屏幕內(nèi)容保持不變。它刷新屏幕以顯示新信息。因此,如果您只執(zhí)行?top?并保持屏幕一直開啟,則屏幕始終顯示最新信息。要停止并退出 shell,可以按下 Ctrl-C。
$ top
18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18
151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%
Mem: 1026912k av, 999548k used, 27364k free, 0k shrd, 116104k buff
758312k actv, 145904k in_d, 16192k in_c
Swap: 2041192k av, 122224k used, 1918968k free 590140k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
451 oracle 15 0 6044 4928 4216 S 0.1 0.4 0:20 0 tnslsnr
8991 oracle 15 0 1248 1248 896 R 0.1 0.1 0:00 0 top
1 root 19 0 440 400 372 S 0.0 0.0 0:04 0 init
2 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 keventd
3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd
4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0 ksoftirqd/0
7 root 15 0 0 0 0 SW 0.0 0.0 0:01 0 bdflush
5 root 15 0 0 0 0 SW 0.0 0.0 0:33 0 kswapd
6 root 15 0 0 0 0 SW 0.0 0.0 0:14 0 kscand
8 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kupdated
9 root 25 0 0 0 0 SW 0.0 0.0 0:00 0 mdrecoveryd
... output snipped ...
讓我們來看看產(chǎn)生的不同類型的信息。第一行:
18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18
顯示當(dāng)前時(shí)間 (18:46:13),該系統(tǒng)已經(jīng)運(yùn)行了 11 天;并且已經(jīng)工作了 21 小時(shí) 50 秒。后面顯示的分別是最近 1、5、15 分鐘的系統(tǒng)平均負(fù)載 (0.11、0.19、0.18)。(順便提一下,您也可以通過執(zhí)行?uptime?命令來獲得這些信息。)
如果不需要平均負(fù)載,按下字母 "l"(小寫字母 L);它將關(guān)閉。要再次將其打開,按下 l。第二行:
151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped
顯示進(jìn)程數(shù)、運(yùn)行的進(jìn)程數(shù)、休眠的進(jìn)程數(shù)等。第三行和第四行:
CPU states: cpu user nice system irq softirq iowait idle
total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%
顯示 CPU 利用率的詳細(xì)信息。上面一行顯示用戶進(jìn)程占用了 CPU 的 12.5%,系統(tǒng)占用了 6.7%。用戶進(jìn)程中包括 Oracle 進(jìn)程。按下 "t" 可以關(guān)閉和打開這三行。如果有多個(gè) CPU,屏幕將在每行顯示一個(gè) CPU 的信息。
接下來的兩行:
Mem: 1026912k av, 1000688k used, 26224k free, 0k shrd, 113624k buff
758668k actv, 146872k in_d, 14460k in_c
Swap: 2041192k av, 122476k used, 1918716k free 591776k cached
顯示可用的和已利用的內(nèi)存。內(nèi)存總量為 "1026912k av"(大約 1GB),其中只有 26224k(即 26MB)是可用的。交換空間為 2GB;但幾乎并未使用。要關(guān)閉和打開這兩行,可以按下 "m"。
其余的顯示內(nèi)容以表格格式顯示進(jìn)程。下面對各列進(jìn)行解釋:
?
| 列 | 描述 |
| PID | 進(jìn)程的進(jìn)程 ID |
| USER | 運(yùn)行該進(jìn)程的用戶 |
| PRI | 進(jìn)程的優(yōu)先級 |
| NI | nice 值:該值越高,任務(wù)的優(yōu)先級越低 |
| SIZE | 該進(jìn)程使用的內(nèi)存(代碼+數(shù)據(jù)+堆棧) |
| RSS | 該進(jìn)程使用的物理內(nèi)存 |
| SHARE | 該進(jìn)程使用的共享內(nèi)存 |
| STAT | 該進(jìn)程的狀態(tài),用代碼顯示。一些主要的狀態(tài)代碼包括: 您還會(huì)看到第二個(gè)和第三個(gè)字符,它們表示: |
| %CPU | 該進(jìn)程使用的 CPU 百分比 |
| %MEM | 該進(jìn)程使用的內(nèi)存百分比 |
| TIME | 該進(jìn)程使用的總 CPU 時(shí)間 |
| CPU | 如果這是一個(gè)多處理器系統(tǒng),該列指明正在其上運(yùn)行進(jìn)程的 CPU 的 ID。 |
| COMMAND | 該進(jìn)程發(fā)出的命令 |
?
顯示?top?時(shí),您可以按幾個(gè)鍵來設(shè)置希望的顯示格式。按下大寫字母 M 鍵可根據(jù)內(nèi)存使用情況對輸出進(jìn)行排序。(注意,使用小寫字母 m 將在顯示屏的頂部打開或關(guān)閉內(nèi)存匯總行。)當(dāng)您希望了解誰在占用內(nèi)存時(shí),該鍵非常有用。示例輸出如下:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
31903 oracle 15 0 75760 72M 72508 S 0.0 7.2 0:01 0 ora_smon_PRODB2
31909 oracle 15 0 68944 66M 64572 S 0.0 6.6 0:03 0 ora_mmon_PRODB2
31897 oracle 15 0 53788 49M 48652 S 0.0 4.9 0:00 0 ora_dbw0_PRODB2
既然您了解了如何解釋輸出,我們來看看如何使用命令行參數(shù)。
最有用的參數(shù)是 -d,它指示兩次屏幕刷新之間的延遲。要每秒刷新一次,則使用?top -d 1。
另一個(gè)有用的選項(xiàng)是 -p。如果您希望只監(jiān)視幾個(gè)進(jìn)程而并非全部,可以在 -p 選項(xiàng)后指定這幾個(gè)進(jìn)程。要監(jiān)視進(jìn)程 13609、13608 和 13554,執(zhí)行以下命令:
top -p 13609 -p 13608 -p 13554
這將以和?top?命令相同的格式顯示結(jié)果,但只顯示特定進(jìn)程的信息。
<!-- Tips Box start -->
適用于 Oracle 用戶的技巧
眾所周知,使用?top?實(shí)用程序分析數(shù)據(jù)庫服務(wù)器的性能非常方便。下面是部分?top?輸出。
20:51:14 up 11 days, 23:55, 4 users, load average: 0.88, 0.39, 0.27113 processes: 110 sleeping, 2 running, 1 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 1.0% 0.0% 5.6% 2.2% 0.0% 91.2% 0.0%
Mem: 1026912k av, 1008832k used, 18080k free, 0k shrd, 30064k buff
771512k actv, 141348k in_d, 13308k in_c
Swap: 2041192k av, 66776k used, 1974416k free 812652k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16143 oracle 15 0 39280 32M 26608 D 4.0 3.2 0:02 0 oraclePRODB2...
5 root 15 0 0 0 0 SW 1.6 0.0 0:33 0 kswapd
... output snipped ...
我們來仔細(xì)分析此輸出。首先,您需要注意 CPU states 下面的 "idle" 列;該列為 0.0%,這意味著 CPU 被完全占用來執(zhí)行某項(xiàng)任務(wù)。問題是 CPU 在做什么?將注意力轉(zhuǎn)向 "system" 列,就在左側(cè)不遠(yuǎn)處;該列顯示 5.6%。這說明,系統(tǒng)本身占用的 CPU 并不多。再向左就是 "user" 列,該列顯示 1.0%。由于用戶進(jìn)程還包括 Oracle,因此 Oracle 并未占用 CPU 周期。那么,到底是什么占用了整個(gè) CPU?
答案就在同一行右側(cè) "iowait" 列下面,該列為 91.2%。一切都明白了:91.2% 的 CPU 時(shí)間都在等待 IO。
為什么會(huì)有這么多的 IO 等待?答案在顯示內(nèi)容中。注意最消耗資源的進(jìn)程的 PID:16143 您可以使用以下查詢來確定該進(jìn)程在做什么:
select s.sid, s.username, s.programfrom v$session s, v$process p
where spid = 16143
and p.addr = s.paddr
/
SID USERNAME PROGRAM
------------------- -----------------------------
159 SYS rman@prolin2 (TNS V1-V3)
rman 進(jìn)程在進(jìn)行與 CPU 周期相關(guān)的 IO 等待。該信息可以幫助您確定接下來的操作流程。
<!-- Tips Box end -->
skill 和 snice
通過前面的討論,您已經(jīng)了解了如何識(shí)別占用 CPU 的資源。如果您發(fā)現(xiàn)了一個(gè)占用大量 CPU 和內(nèi)存的進(jìn)程,但又不想停止它,該怎么辦?考慮下面的?top?輸出:
$ top -c -p 16514
23:00:44 up 12 days, 2:04, 4 users, load average: 0.47, 0.35, 0.31
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 0.0% 0.6% 8.7% 2.2% 0.0% 88.3% 0.0%
Mem: 1026912k av, 1010476k used, 16436k free, 0k shrd, 52128k buff
766724k actv, 143128k in_d, 14264k in_c
Swap: 2041192k av, 83160k used, 1958032k free 799432k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16514 oracle 19 4 28796 26M 20252 D N 7.0 2.5 0:03 0 oraclePRODB2...
既然您確認(rèn)進(jìn)程 16514 占用了大量內(nèi)存,您就可以使用?skill?命令“凍結(jié)”它,而不是停止它。
$ skill -STOP 1
之后,檢查?top?輸出:
23:01:11 up 12 days, 2:05, 4 users, load average: 1.20, 0.54, 0.38
1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 2.3% 0.0% 0.3% 0.0% 0.0% 2.3% 94.8%
Mem: 1026912k av, 1008756k used, 18156k free, 0k shrd, 3976k buff
770024k actv, 143496k in_d, 12876k in_c
Swap: 2041192k av, 83152k used, 1958040k free 851200k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16514 oracle 19 4 28796 26M 20252 T N 0.0 2.5 0:04 0 oraclePRODB2...
現(xiàn)在,CPU 從 0% 空閑變?yōu)?94% 空閑。該進(jìn)程被有效凍結(jié)。過一段時(shí)間之后,您可能希望喚醒該進(jìn)程:
$ skill -CONT 16514
如果希望暫時(shí)凍結(jié)進(jìn)程以便為完成更重要的進(jìn)程騰出空間,該方法非常有用。
此命令用途很廣。如果您要停止 "oracle" 用戶的所有進(jìn)程,只需要一個(gè)命令即可實(shí)現(xiàn):
$ skill -STOP oracle
可以使用用戶、PID、命令或終端 id 作為參數(shù)。以下命令可停止所有 rman 命令。
$ skill -STOP rman
如您所見,skill?決定您輸入的參數(shù)(進(jìn)程 ID、用戶 ID 或命令)并進(jìn)行相應(yīng)操作。這可能會(huì)導(dǎo)致在某些情況下出現(xiàn)這樣的問題:您可能具有同名的用戶和命令。最好的示例是 "oracle" 進(jìn)程,通常由用戶 "oracle" 運(yùn)行。因此,當(dāng)您希望停止名為 "oracle" 的進(jìn)程時(shí),可執(zhí)行以下命令:
$ skill -STOP oracle
用戶 "oracle" 的所有進(jìn)程都停止,包括您可能要使用的會(huì)話。要非常明確地執(zhí)行命令,您可以選擇使用一個(gè)新參數(shù)指定參數(shù)的類型。要停止一個(gè)名為 oracle 的命令,可執(zhí)行以下命令:
$ skill -STOP -c oracle
snice 命令的功能與 skill 類似。但它用于降低進(jìn)程的優(yōu)先級,而不是停止進(jìn)程。首先,檢查 top 輸出:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
3 root 15 0 0 0 0 RW 0.0 0.0 0:00 0 kapmd
13680 oracle 15 0 11336 10M 8820 T 0.0 1.0 0:00 0 oracle
13683 oracle 15 0 9972 9608 7788 T 0.0 0.9 0:00 0 oracle
13686 oracle 15 0 9860 9496 7676 T 0.0 0.9 0:00 0 oracle
13689 oracle 15 0 10004 9640 7820 T 0.0 0.9 0:00 0 oracle
13695 oracle 15 0 9984 9620 7800 T 0.0 0.9 0:00 0 oracle
13698 oracle 15 0 10064 9700 7884 T 0.0 0.9 0:00 0 oracle
13701 oracle 15 0 22204 21M 16940 T 0.0 2.1 0:00 0 oracle
現(xiàn)在,將 "oracle" 進(jìn)程的優(yōu)先級降低四個(gè)點(diǎn)。注意,該值越高,優(yōu)先級越低。
$ snice +4 -u oracle
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16894 oracle 20 4 38904 32M 26248 D N 5.5 3.2 0:01 0 oracle
注意,NI 列(nice 值)現(xiàn)在是 4,優(yōu)先級現(xiàn)在設(shè)置為 20,而不是 15。這對于降低優(yōu)先級非常有幫助。
Arup Nanda?(arup@proligence.com) 擔(dān)任 Oracle DBA 已 12 余載,處理過從性能優(yōu)化到安全性和災(zāi)難恢復(fù)等各方面的數(shù)據(jù)庫管理問題。他與人合著了?PL/SQL for DBAs?(O'Reilly Media, 2005),并曾在 2003 年榮獲?Oracle Magazine?的 DBA 稱號(hào),現(xiàn)在為 Oracle ACE。
轉(zhuǎn)載于:https://blog.51cto.com/jarson/573636
總結(jié)
以上是生活随笔為你收集整理的高级 Linux 命令精通指南(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010 + QT 5 +open
- 下一篇: hdu 3308 线段树