1.at命令:定時運行命令
作用:at命令在指定時刻執行指定的命令序列。
格式:
at [-V] [-q x] [-f file] [-m] time atq [-V] [-q x] atrm [-V] [-q x] job… batch [-V] [-f file] [-m]
主要選項如下。
-V:顯示作業將被執行的時間。
-q:選用q參數則可選隊列名稱,隊列名稱可以是a~z和A~Z之間的任意字母。隊列字母順序越高則隊列優先級別越低。
-f:從文件中讀取命令或shell腳本,而非在提示後指定它們。
-m:執行完作業後發送電子郵件到用戶。
time:設定作業執行的時間。time參數可以是下面格式中的任何一種。
HH:MM格式--如04:00,代表4:00AM。如果時間已過,就會在第二天的這一時間執行。
midnight代表12:00AM。noon代表12:00PM。teatime代表4:00PM。
英文月名日期年份格式--如January 15 2005,代表2005年1月15日。年份可無。
MMDDYY、MM/DD/YY或MM.DD.YY格式--如011505,代表2005年1月15日。
now +時間格式--時間以minutes、hours、days或weeks為單位。如now + 5 days,代表命令應該在5天之後的此時此刻執行。偏移量的格式為時間+偏移量,單位是minutes、hours和days。
說明:at命令實際上是一組命令集合。at命令在指定時刻執行指定的命令序列。atq查詢已經設定的命令序列。atrm刪除已經設定的命令序列。batch當系統負載低於一個設定值(0.8),執行設定的命令序列。
應用實例如下。
(1)讓系統在兩天後的17:30執行文件data中指定的作業,使用命令:
#at -f data 15:30 +2 days
(2)配置batch作業
要在系統平均載量降到0.8以下時執行某項一次性的任務,使用batch命令。鍵入batch命令後,"at>"提示就會出現。鍵入要執行的命令,按"Enter"鍵,然後鍵入"Ctrl-D"。你可以指定多條命令,方法是鍵入每一條命令後按"Enter"鍵。鍵入所有命令後,按"Enter"鍵轉入一個空行,然後再鍵入"Ctrl-D"。或者你也可以在提示後輸入shell腳本,在腳本的每一行後按"Enter"鍵,然後在空行處鍵入"Ctrl-D"來退出。系統平均載量一降到0.8以下,這組命令或腳本就會被執行。如果這組命令或腳本試圖在標准輸出中顯示信息,該輸出會用電子郵件方式被郵寄給用戶。
(3)進階應用:控制對at和batch的使用
通過/etc/at.allow和/etc/at.deny文件可以用來限制對at和batch命令的使用。這兩個使用控制文件的格式都是每行一個用戶。兩個文件都不允許使用空白字符。如果控制文件被修改了,at守護進程不必被重啟。每次用戶試圖執行at或batch命令時,使用控制文件都會被讀取。不論控制文件如何規定,超級權限用戶總是可以執行at和batch命令。如果at.allow文件存在,只有其中列出的用戶才能使用at或batch命令,at.deny文件會被忽略。如果at.allow文件不存在,所有在at.deny文件中列出的用戶都被禁止使用at和batch命令。
2.bg命令後台運行命令
作用:bg命令使一個被掛起的進程在後台執行。
格式:bg
該命令無參數。
使用說明:Linux作為一個多任務環境,用戶會同時執行多項任務,例如,查看系統情況、備份資料、編輯文件和打印文件等。耗時長的任務不應該在前台任務中執行,而應該交給後台任務去執行。這樣前台任務可繼續正常運作其他的操作,不用等待。
應用實例如下。
(1)如果要將一個大目錄的文件進行排序後,將結果輸入到一個文件中,可以使用命令:
#du -a / | sort -rn > /tmp/du.sorted
(2)由於這個命令執行時間很長,可以把它放在後台運行。使用組合鍵"Ctrl+Z"。然後使用bg命令。如果想直接把這個命令放在後台執行,可以在命令後使用"&"符號:
#du -a / | sort -rn > /tmp/du.sorted & [1] 237m32
3.Fg掛起程序
作用:fg命令使一個被掛起的進程在前台執行。
格式:fg -[job-spec]
[job-spec]:後台任務號碼。
說明:fg命令和bg命令是相對應的。如果想查看後台程序運行情況,可以使用fg命令把它調回前台查看。bg命令可以使多個進程放到後台中執行。
應用實例如下。
使用fg命令時,要加入後台任務號碼,如果不加任何號碼,則所變動的均是當前任務。
#du -a / | sort -rn > /tmp/du.sorted & [1] 237 #fg 1
4.Jobs顯示後台程序
作用:jobs命令顯示後台任務的執行情況。
格式:jobs [選項] [jobspec…]
主要選項如下。
-l:長輸出格式,顯示全部內容。
-n:不輸出信息。
-p:只輸出進程號。
-r:只輸出運行的進程。
[jobspec]:後台任務號碼。
應用實例如下。
先把兩個進程放在系統後台運行,然後使用jobs命令查看後台任務的執行情況:
#du -a /etc > user.data & [1] 233 # find / -name core -type f -ls > core.data & [2] 234 #jobs -l [1] + 237 Running du -a /etc > user.data [2] - 238 Running find / -name core -type f -ls > core.data
說明:上面的當前任務是"du -a /etc > user.data",因為後台任務號碼是"[1]"。當第一個後台任務順利執行完畢,第二個後台任務還在執行中時,當前任務便會自動變成後台任務號碼"[2]"的後台任務。即當前任務是動態的。
5.kill命令殺掉進程
作用:kill命令終止一個進程。
格式:kill [-s signal |-p] [-a]pid…
kill -l [ signal ]
主要選項如下。
-s:指定發送的信號。
-p:模擬發送信號。
-l:指定信號的名稱列表。
pid:要終止的進程的ID號。
signal:表示信號。
說明:kill可將指定的信息送至程序。預設的信息為SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強制刪除程序。kill命令的工作原理是,向Linux系統的內核發送一個系統操作信號和某個程序的進程標志號,然後系統內核就可以對進程標志號指定的進程進行操作。當需要中斷一個前台進程的時候,通常使用Ctrl+C組合鍵;但是對於一個後台進程,就不是一個組合鍵所能解決的了,這時就必須使用kill命令。
應用實例如下。
命令執行過程如果出錯,用戶可用"kill"來結束任務。對於在後台運行的進程,可以使用kill命令終止:
#du -a / | sort -rn > /tmp/du.sorted & [1] 237 #kill 237
或者使用命令:
#du -a / | sort -rn > /tmp/du.sorted & [1] 237 #kill %1
對於僵屍進程,可以用kill-9來強制終止退出。
比如一個程序已經徹底死掉,如果kill不加信號強度沒有辦法退出,最好的辦法就是加信號強度-9,後面要接殺父進程;比如;
比如:
[root@localhost ~]# ps aux |grep gaim beinan 5031 9.0 2.3 104996 17484 S 13:23 0:01 gaim root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim
kill命令族成員簡介如下。
終止一個進程或終止一個正在運行的程序,一般通過kill、killall、pkill、xkill等進行。比如一個程序已經死掉,但又不能退出,這時就應該考慮應用這些工具。killall通過程序的名字,直接殺死所有進程,pkill和killall的應用方法差不多,也是直接殺死運行中的程序。如果你想殺掉單個進程,請用kill來殺掉。xkill是在桌面用的殺死圖形界面的程序。比如當firefox出現崩潰不能退出時,點鼠標就能殺死firefox。當xkill運行時出來和個人腦骨的圖標,哪個圖形程序崩潰,一點就OK了。如果你想終止xkill,就單擊右鍵取消。
6.crontab命令
作用:crontab命令用於安裝、刪除或者列出用於驅動cron後台進程的任務表。然後,該配置由cron守護進程在設定的時間執行。
格式:crontab [-u user] 文件
crontab [-u user] { -e | -l | -r }
主要選項如下。
-e:執行文字編輯器來設定時程表,默認的文字編輯器是vi。
-r:刪除目前的時程表。
-l:列出目前的時程表。
[-u user]:指定要設置的用戶名稱。
crontab文件的格式是:
minute hour day month dayofweek command
minute--分鐘,從0~59之間的任何整數。hour--小時,從0~23之間的任何整數。day--日期,從1~31之間的任何整數(如果指定了月份,必須是該月份的有效日期)。month--月份,從1~12之間的任何整數(或使用月份的英文簡寫如jan、feb等)。dayofweek--星期,從0~7之間的任何整數,這裡的0或7代表星期日(或使用星期的英文簡寫如sun、mon等)。command--要執行的命令(可以是ls之類的命令,也可以是執行你自行編寫的腳本的命令。)
應用實例如下。
設置一個定時、定期的系統提示:
[cao @www cao]#crontab -e
此時系統會打開一個vi編輯器,如果我輸入"35 17 * * 5 Wall"明天休息,注意備份數據庫",然後存盤退出。這時在/var/spool/cron/目錄下會生產一個cao的文件,內容如下:
# DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.2707 installed on Thu Jan 1 22:01:51 2004) # (Cron version -- $Id: crontab. c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
35 17 * * 5 wall "明天休息,注意備份數據庫 "
這樣到每個星期五下班時間(17:35),系統就會彈出一個終端提醒我們注意備份數據庫。顯示結果如圖4-7所示。
7.ps命令查看權限
作用:ps命令主要查看系統中進程的狀態。
格式:ps [選項]
主要選項如下。
-A:顯示系統中所有進程的信息。
-e:顯示所有進程的信息。
-f:顯示進程的所有信息。
-l:以長格式顯示進程信息。
-r:只顯示正在運行的進程。
-u:顯示面向用戶的格式(包括用戶名、CPU及內存使用情況等信息)。
-x:顯示所有非控制終端上的進程信息。
-p:顯示由進程ID指定的進程的信息。
-t:顯示指定終端上的進程的信息。
說明:要對進程進行監測和控制,首先要了解當前進程的情況,也就是需要查看當前進程。ps命令就是最基本、也是非常強大的進程查看命令。根據顯示的信息可以確定哪個進程正在運行、哪個進程被掛起、進程已運行了多久、進程正在使用的資源、進程的相對優先級,以及進程的標志號(PID)。所有這些信息對用戶都很有用,對於系統管理員來說更為重要。使用"ps -aux"命令可以獲得終端上所有用戶的有關進程的所有信息,下面結合圖4-8講解進程的基本信息。
圖4-8第二行代碼中,USER表示啟動進程用戶。PID表示進程標志號。%CPU表示運行該進程占用CPU的時間與該進程總的運行時間的比例。%MEM表示該進程占用內存和總內存的比例。VSZ表示占用的虛擬內存大小,以KB為單位。RSS為進程占用的物理內存值,以KB為單位。TTY表示該進程建立時所對應的終端,"?"表示該進程不占用終端。STAT表示進程的運行狀態,包括以下幾種代碼:D,不可中斷的睡眠;R,就緒(在可運行隊列中);S,睡眠;T,被跟蹤或停止;Z,終止(僵死)的進程,Z不存在,但暫時無法消除;W,沒有足夠的內存分頁可分配;<高優先序的進程;N,低優先序的進程;L,有內存分頁分配並鎖在內存體內(實時系統或I/O)。START為進程開始時間。TIME為執行的時間。COMMAND是對應的命令名。
應用實例如下。
在進行系統維護時,如果CPU負載突然增加,而又不知道是哪一個進程造成的情況。使用命令:
#ps aux | sort +3n
說明 因為%CPU選項在第三列,所以sort選3作為參數,+表示升序輸出結果。
8.pstree命令
pstree命令列出當前的進程,以及它們的樹狀結構。
格式:pstree [選項] [pid|user]
主要選項如下。
-a:顯示執行程序的命令與完整參數。
-c:取消同名程序,合並顯示。
-h:對輸出結果進行處理,高亮顯示正在執行的程序。
-l:長格式顯示。
-n:以PID大小排序。
-p:顯示PID。
-u:顯示UID信息。
-G:使用VT100終端編碼顯示。
-U:使用UTF-8(Unicode)編碼顯示。
說明:使用ps命令得到的數據精確,但數據龐大,這一點對掌握系統整體概況來說是不容易的。pstree正好可以彌補這個缺憾。它能將當前的執行程序以樹狀結構顯示。pstree支持指定特定程序(PID)或使用者(USER)作為顯示的起始。
應用實例如下。
進程啟動的時候可能會產生自己的一個子進程。運行pstree命令就可以很容易地看到這些信息。以超級用戶權限運行pstree:
#init-+-apmd
|-atd
|-bdflush
|-gconfd-2
|-gdm-binary---gdm-binary-+-X
| `-startkde-+-kwrapper
| `-ssh-agent
|-gpm
|-httpd---8*[httpd]
……下略
命令對程序名稱相同的會自動合並,所有"|-httpd---8*[httpd]"即表示系統中有8個httpd進程產生的子進程。
9.top命令顯示進程
top命令用來顯示系統當前的進程狀況。
格式:top [選項]
主要選項如下。
d:指定更新的間隔,以秒計算。
q:沒有任何延遲的更新。如果使用者有超級用戶,則top命令將會以最高的優先序執行。
c:顯示進程完整的路徑與名稱。
S:累積模式,會將已完成或消失的子進程的CPU時間累積起來。
s:安全模式。
i:不顯示任何閒置(Idle)或無用(Zombie)的進程。
n:顯示更新的次數,完成後將會退出top。
說明:top命令和ps命令的基本作用是相同的,都顯示系統當前的進程狀況。但是top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態。這裡結合圖4-9來說明它給出的信息。
圖4-9 top命令詳解
在圖4-9中,第一行表示的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載。第二行顯示的是所有啟動的、目前運行的、掛起(Sleeping)的和無用(Zombie)的進程。第三行顯示的是目前CPU的使用情況,包括系統占用的比例、用戶使用比例、閒置(Idle)比例。第四行顯示物理內存的使用情況,包括總的可以使用的內存、已用內存、空閒內存、緩沖區占用的內存。第五行顯示交換分區的使用情況,包括總的交換分區、使用的、空閒的和用於高速緩存的交換分區。第六行顯示的項目最多,下面列出了詳細解釋。
PID(Process ID):進程標志號,是非零正整數。USER:進程所有者的用戶名。PR:進程的優先級別。NI:進程的優先級別數值。VIRT:進程占用的虛擬內存值。RES:進程占用的物理內存值。SHR:進程使用的共享內存值。STAT:進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。%CPU:該進程占用的CPU使用率。%MEM:該進程占用的物理內存和總內存的百分比。TIME:該進程啟動後占用的總的CPU時間。COMMAND:進程啟動的啟動命令名稱,如果這一行顯示不下,進程會有一個完整的命令行。top命令使用過程中,還可以使用一些交互的命令來完成其他參數的功能。這些命令是通過快捷鍵啟動的。
<空格>:立刻刷新。
P:根據CPU使用大小進行排序。
T:根據時間、累計時間排序。
q:退出top命令。
m:切換顯示內存信息。
t:切換顯示進程和CPU狀態信息。
c:切換顯示命令名稱和完整命令行。
M:根據使用內存大小進行排序。
W:將當前設置寫入~/.toprc文件中。這是寫top配置文件的推薦方法。
可以看到,top命令是一個功能十分強大的監控系統的工具,對於系統管理員而言尤其重要。但是,它的缺點是會消耗很多系統資源。
Linux進程管理命令詳解(4)
10.nice命令改變權限優先級
作用:nice命令可以改變程序執行的優先權等級。
格式:nice [-n <優先等級>][--help][--version][命令]
主要選項如下。
-n<優先等級>或-<優先等級>或--adjustment=<優先等級>:設置欲執行的命令的優先權等級。等級的范圍從-20~19,其中-20為最高,19為最低。
--help:在線幫助。
說明:應用程序優先權值的范圍從-20~19,數字越小,優先權就越高。一般情況下,普通應用程序的優先權值(CPU使用權值)都是0,如果讓常用程序擁有較高的優先權等級,自然啟動和運行速度都會快些。需要注意的是普通用戶只能在0~19之間調整應用程序的優先權值,只有超級用戶有權調整更高的優先權值(從-20~19)。
應用實例如下。
將ls命令的優先序加1並執行,將結果輸入文件1.txt:
# nice -n 1 ls >1.txt
11.renice命令修改優先級
作用:renice命令允許用戶修改一個正在運行的進程的優先權。
格式:renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ]
主要選項如下。
priority:優先等級
-p pids:改變該程序的優先權等級,此參數為預設值。
-g pgrps:使用程序群組名稱,修改所有隸屬於該程序群組的程序的優先權。
-u user:指定用戶名稱,修改所有隸屬於該用戶的程序的優先權。
說明:renice命令可重新調整正在執行的程序的優先權等級。默認是以程序識別碼指定程序,調整其優先權,也可以指定程序群組或用戶名稱調整優先權等級,並修改所有隸屬於該程序群組或用戶的程序的優先權。等級范圍從-20~19,只有超級用戶可以改變其他用戶程序的優先權和設置負數等級。普通用戶只能對自己所有的進程使用renice命令。
應用實例如下。
將進程PID為987及32的進程與進程擁有者為daemon及root的優先級別號加1:
#renice +1 987 -u daemon root -p 32
12.sleep命令暫停進程
作用:sleep命令的功能是使進程暫停執行一段時間。
格式:sleep number [選項]
主要選項如下。
number:時間長度,後面可接s、m、h或d。
s:以秒為單位。
m:以分鐘為單位。
h:以小時為單位。
d:以天為單位。
說明:如果沒有指定時間,以秒為單位。此命令大多用於shell程序設計中,使兩條命令執行之間停頓指定的時間。
應用實例如下。
下面的命令使進程先暫停60秒,然後查看哪個用戶登錄到系統中:
#sleep 60; who
13.nohup命令用戶退出系統之後繼續工作
作用:nohup命令確保執行程序能在用戶退出系統之後繼續工作。
格式:nohup命令
說明:一般退出Linux系統時,會把所有的程序全部結束掉,包括那些後台程序。但有時候,例如,用戶正在下載一個很大的文件,但是你因下班或有事需要先退出系統,希望退出系統時程序還能繼續執行。這時,我們就可以使用nohup命令使進程在用戶退出後仍繼續執行。同時這些進程都在後台執行(命令放到後台運行,nohup必須與&操作同時使用),結果則會寫到用戶自己的目錄下的nohup.out文件裡。
應用實例如下。
程序在後台自動執行:
nohup wget -c -t0 http://www.bsdr.com/ghs1.rar &
14.pgrep命令
作用:pgrep命令查找當前運行的進程,並列出匹配給定條件的進程的pid。所有的條件都必須匹配才會被列出。
使用權限:所有用戶。
格式:Pgrep [選項][程序名]
選項如下。
-l:列出程序名和進程ID。
-o:進程起始的ID。
-n:進程終止的ID。
應用實例如下。
用戶cao查看sshd的進程列表:
[cao@localhost@cao]$pgrep -l sshd
829 sshd
Linux進程管理命令詳解(5)
15.chkconfig命令設置系統的各種服務
作用:chkconfig命令檢查,設置系統的各種服務。
格式:chkconfig [--add][--del][--list][系統服務]
或chkconfig [--level <等級代號>][系統服務][on/off/reset]
主要選項如下。
--add:增加所指定的系統服務,讓chkconfig指令得以管理它,並同時在系統啟動的敘述文件內增加相關數據。
--del:刪除所指定的系統服務,不再由chkconfig指令管理,並同時在系統啟動的敘述文件內刪除相關數據。
--level<等級代號>:指定讀系統服務要在哪一個執行等級中開啟或關畢。
說明:chkconfig提供了一個簡單的命令行工具用於維護/etc/rc[0-6].d的路徑層次,可以幫助系統管理員在這些路徑中直接操作符號行,chkconfig的執行是通過chkconfig命令激發的,此命令目前在irix操作系統中存在。甚至包括了維護/etc/rc[0-6].d層次之外的設置信息。chkconfig有5個不同的函數:為管理器添加新服務,從管理器中移出服務,列出當前啟動的服務信息,改變服務啟動信息,檢查特殊服務的啟動狀態。這是Red Hat公司遵循GPL規則所開發的程序,它可查詢操作系統在每一個執行等級中會執行哪些系統服務,其中包括各類常駐服務。
應用實例如下。
Chkconfig管理服務技巧
如果你使用chkconfig --list命令,你會看到一個系統服務列表,以及它們在運行級別0~6中已被啟動(on)或停止(off)。在列表末端,你會看到由xinetd管理的服務部分。如果你使用chkconfig--list來查詢由xinetd管理的服務,你會看到xinetd服務是被啟用(on)還是被關閉(off)了。例如,命令chkconfig--list finger返回了下列輸出:
finger on
如上所示,finger作為xinetd服務被啟用。如果xinetd在運行,finger就會被啟用。
如果你使用chkconfig --list來查詢/etc/rc.d中的服務,你會看到服務在每個運行級別中的設置。例如,命令chkconfig --list anacron返回了下列輸出:
Anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off
chkconfig還能用來設置某一服務在某一指定的運行級別內被啟動還是被停運。例如,要在運行級別3、4、5中停運nscd服務,使用下面的命令:
Chkconfig --level 345 nscd off
補充說明:由xinetd管理的服務會立即被chkconfig影響。例如,如果xinetd在運行,finger被禁用,那麼執行了chkconfig finger on命令後,finger可以自動隨xinetd的改變而自動啟用。對其他服務的改變在使用chkconfig之後不會立即生效。你必須使用service daemon stop命令來停止個別服務。在前面的例子中,把daemon換成你想停止的服務名稱,如httpd。把stop換成start或restart來啟動或重新啟動該服務。
4.4 總結
進程管理還是需要的,雖然在桌面應用上,我們點鼠標就能完成大多的工作,但在服務器管理中,進程管理還是十分重要的。以上介紹的Linux下進程管理的命令都是比較重要的,通過這些命令可以對進程進行觀察。進程運行需要占用系統資源,一個進程如果占用大量資源會造成系統性能瓶頸現象。此時就需要進行進程調度,達到實時監控系統和優化性能的目的。
你對每個進程了解得越多,就能夠越容易地精確定位進程的問題所在。系統通常會因為某種原因遇到各種問題,比如速度變慢或者不穩定,而使用這些工具可以幫助你提高找到問題所在的能力。