Linux管理程序的最好方法就是使用指令行下的系統指令。Linux下面的程序涉及的指令有at, bg, fg, kill, crontab, jobs, ps, pstree, top, nice, renice, sleep, nohup。
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]"的背景任務。即目前任務是動态的。
Linux程序管理指令詳解(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所示。
(點選檢視大圖)圖4-7 一個定時、定期的系統提示
7.ps指令檢視權限
作用:ps指令主要檢視系統中程序的狀态。
格式:ps [選項]
-A:顯示系統中所有程序的資訊。
-e:顯示所有程序的資訊。
-f:顯示程序的所有資訊。
-l:以長格式顯示程序資訊。
-r:隻顯示正在運作的程序。
-u:顯示面向使用者的格式(包括使用者名、CPU及記憶體使用情況等資訊)。
-x:顯示所有非控制終端上的程序資訊。
-p:顯示由程序ID指定的程序的資訊。
-t:顯示指定終端上的程序的資訊。
說明:要對程序進行監測和控制,首先要了解目前程序的情況,也就是需要檢視目前程序。ps指令就是最基本、也是非常強大的程序檢視指令。根據顯示的資訊可以确定哪個程序正在運作、哪個程序被挂起、程序已運作了多久、程序正在使用的資源、程序的相對優先級,以及程序的标志号(PID)。所有這些資訊對使用者都很有用,對于系統管理者來說更為重要。使用"ps -aux"指令可以獲得終端上所有使用者的有關程序的所有資訊,下面結合圖4-8講解程序的基本資訊。
Linux程序管理指令詳解(3)
圖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是對應的指令名。
(點選檢視大圖)圖4-8 ps-aux指令詳解
在進行系統維護時,如果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 &
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下程序管理的指令都是比較重要的,通過這些指令可以對程序進行觀察。程序運作需要占用系統資源,一個程序如果占用大量資源會造成系統性能瓶頸現象。此時就需要進行程序排程,達到實時監控系統和優化性能的目的。