Linux程式管理及作業控制(轉)
Linux程式管理及作業控制(轉)[@more@]Linux是一個多工的作業系統,系統上同時執行著多個程式,正在執行的一個或多個相關程式稱為一個作業。使用作業控制,使用者可以同時執行多個作業,並在需要時在作業之間進行切換。本章詳細介紹程式管理及作業控制的命令,包括啟動程式、檢視程式、排程作業的命令。
程式及作業的概念
Linux是一個多使用者多工的作業系統。多使用者是指多個使用者可以在同一時間使用計算機系統;多工是指Linux可以同時執行幾個任務,它可以在還未執行完一個任務時又執行另一項任務。
作業系統管理多個使用者的請求和多個任務。大多數系統都只有一個CPU和一個主存,但一個系統可能有多個二級儲存磁碟和多個輸入/輸出裝置。作業系統管理這些資源並在多個使用者間共享資源,當您提出一個請求時,給您造成一種假象,好象系統只被您獨自佔用。而實際上作業系統監控著一個等待執行的任務佇列,這些任務包括使用者作業、作業系統任務、郵件和列印作業等。作業系統根據每個任務的優先順序為每個任務分配合適的時間片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經足夠計算機完成成千上萬的指令集。每個任務都會被系統執行一段時間,然後掛起,系統轉而處理其他任務;過一段時間以後再回來處理這個任務,直到某個任務完成,從任務佇列中去除。
Linux系統上所有執行的東西都可以稱之為一個程式。每個使用者任務、每個系統管理守護程式,都可以稱之為程式。Linux用分時管理方法使所有的任務共同分享系統資源。我們討論程式的時候,不會去關心這些程式究竟是如何分配的,或者是核心如何管理分配時間片的,我們所關心的是如何去控制這些程式,讓它們能夠很好地為使用者服務。
程式的一個比較正式的定義是:在自身的虛擬地址空間執行的一個單獨的程式。程式與程式是有區別的,程式不是程式,雖然它由程式產生。程式只是一個靜態的指令集合,不佔系統的執行資源;而程式是一個隨時都可能發生變化的、動態的、使用系統執行資源的程式。而且一個程式可以啟動多個程式。
Linux作業系統包括三種不同型別的程式,每種程式都有自己的特點和屬性。
互動程式——由一個shell啟動的程式。互動程式既可以在前臺執行,也可以在後臺執行。
批處理程式——這種程式和終端沒有聯絡,是一個程式序列。
監控程式(也稱守護程式)——Linux系統啟動時啟動的程式,並在後臺執行。
上述三種程式各有各的作用,使用場合也有所不同。
程式和作業的概念也有區別。一個正在執行的程式稱為一個作業,而且作業可以包含一個或多個程式,尤其是當使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”這個作業就同時啟動了三個程式。
作業控制指的是控制正在執行的程式的行為。比如,使用者可以掛起一個程式,等一會兒再繼續執行該程式。shell將記錄所有啟動的程式情況,在每個程式過程中,使用者可以任意地掛起程式或重新啟動程式。作業控制是許多shell(包括bash和tcsh)的一個特性,使使用者能在多個獨立作業間進行切換。
一般而言,程式與作業控制相關聯時,才被稱為作業。
在大多數情況下,使用者在同一時間只執行一個作業,即它們最後向shell鍵入的命令。但是使用作業控制,使用者可以同時執行多個作業,並在需要時在這些作業間進行切換。這會有什麼用途呢?例如,當使用者編輯一個文字檔案,並需要中止編輯做其他事情時,利用作業控制,使用者可以讓編輯器暫時掛起,返回shell提示符開始做其他的事情。其他事情做完以後,使用者可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象使用者從來沒有離開編輯器一樣。這只是一個例子,作業控制還有許多其他實際的用途。
啟動程式
鍵入需要執行的程式的程式名,執行一個程式,其實也就是啟動了一個程式。在Linux系統中每個程式都具有一個程式號,用於系統識別和排程程式。啟動一個程式有兩個主要途徑:手工啟動和排程啟動,後者是事先進行設定,根據使用者要求自行啟動。
手工啟動
由使用者輸入命令,直接啟動一個程式便是手工啟動程式。但手工啟動程式又可以分為很多種,根據啟動的程式型別不同、性質不同,實際結果也不一樣,下面分別介紹。
1. 前臺啟動
這或許是手工啟動一個程式的最常用的方式。一般地,使用者鍵入一個命令“ls –l”,這就已經啟動了一個程式,而且是一個前臺的程式。這時候系統其實已經處於一個多程式狀態。或許有些使用者會疑惑:我只啟動了一個程式而已。但實際上有許多執行在後臺的、系統啟動時就已經自動啟動的程式正在悄悄執行著。還有的使用者在鍵入“ls –l”命令以後趕緊使用“ps –x”檢視,卻沒有看到ls程式,也覺得很奇怪。其實這是因為ls這個程式結束太快,使用ps檢視時該程式已經執行結束了。如果啟動一個比較耗時的程式:
find / -name fox.jpg
然後再把該程式掛起,使用ps檢視,就會看到一個find程式在裡面。
2. 後臺啟動
直接從後臺手工啟動一個程式用得比較少一些,除非是該程式甚為耗時,且使用者也不急著需要結果的時候。假設使用者要啟動一個需要長時間執行的格式化文字檔案的程式。為了不使整個shell在格式化過程中都處於“癱瘓”狀態,從後臺啟動這個程式是明智的選擇。
[例1]
$ troff –me notes > note_form &
[1] 4513
$
由上例可見,從後臺啟動程式其實就是在命令結尾加上一個&號。鍵入命令以後,出現一個數字,這個數字就是該程式的編號,也稱為PID,然後就出現了提示符。使用者可以繼續其他工作。
上面介紹了前、後臺啟動的兩種情況。實際上這兩種啟動方式有個共同的特點,就是新程式都是由當前shell這個程式產生的。也就是說,是shell建立了新程式,於是就稱這種關係為程式間的父子關係。這裡shell是父程式,而新程式是子程式。一個父程式可以有多個子程式,一般地,子程式結束後才能繼續父程式;當然如果是從後臺啟動,那就不用等待子程式結束了。
一種比較特殊的情況是在使用管道符的時候。例如:
nroff -man ps.1|grep kill|more
這時候實際上是同時啟動了三個程式。請注意是同時啟動的,所有放在管道兩邊的程式都將被同時啟動,它們都是當前shell的子程式,互相之間可以稱為兄弟程式。
以上介紹的是手工啟動程式的一些內容,作為一名系統管理員,很多時候都需要把事情安排好以後讓其自動執行。因為管理員不是機器,也有離開的時候,所以有些必須要做的工作而恰好管理員不能親自操作,這時候就需要使用排程啟動程式了。
排程啟動
有時候需要對系統進行一些比較費時而且佔用資源的維護工作,這些工作適合在深夜進行,這時候使用者就可以事先進行排程安排,指定任務執行的時間或者場合,到時候系統會自動完成這一切工作。
要使用自動啟動程式的功能,就需要掌握以下幾個啟動命令。
at命令
使用者使用at命令在指定時刻執行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執行時間才可以正常執行。at命令可以只指定時間,也可以時間和日期一起指定。需要注意的是,指定時間有個系統判別問題。比如說:使用者現在指定了一個執行時間:凌晨3:20,而發出at命令的時間是頭天晚上的20:00,那麼究竟是在哪一天執行該命令呢?如果使用者在3:20以前仍然在工作,那麼該命令將在這個時候完成;如果使用者3:20以前就退出了工作狀態,那麼該命令將在第二天凌晨才得到執行。下面是at命令的語法格式:
at [-V] [-q 佇列] [-f 檔名] [-mldbv] 時間
at -c 作業 [作業...]
at允許使用一套相當複雜的指定時間的方法,實際上是將POSIX.2標準擴充套件了。它可以接受在當天的hh:mm(小時:分鐘)式的時間指定。如果該時間已經過去,那麼就放在第二天執行。當然也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的詞語來指定時間。使用者還可以採用12小時計時制,即在時間後面加上AM(上午)或者PM(下午)來說明是上午還是下午。
也可以指定命令執行的具體日期,指定格式為month day(月 日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式為:now + count time-units ,now就是當前時間,time-units是時間單位,這裡可以是 minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。
還有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。下面透過一些例子來說明具體用法。
[例2] 指定在今天下午5:30執行某命令。假設現在時間是中午12:30,1999年2月24日,其命令格式如下:
at 5:30pm
at 17:30
at 17:30 today
at now + 5 hours
at now + 300 minutes
at 17:30 24.2.99
at 17:30 2/24/99
at 17:30 Feb 24
以上這些命令表達的意義是完全一樣的,所以在安排時間的時候完全可以根據個人喜好和具體情況自由選擇。一般採用絕對時間的24小時計時法可以避免由於使用者自己的疏忽造成計時錯誤的情況發生,例如上例可以寫成:
at 17:30 2/24/99
這樣非常清楚,而且別人也看得懂。
對於at命令來說,需要定時執行的命令是從標準輸入或者使用-f選項指定的檔案中讀取並執行的。如果at命令是從一個使用su命令切換到使用者shell中執行的,那麼當前使用者被認為是執行使用者,所有的錯誤和輸出結果都會送給這個使用者。但是如果有郵件送出的話,收到郵件的將是原來的使用者,也就是登入時shell的所有者。
[例3]
$ at -f work 4pm + 3 days
在三天後下午4點執行檔案work中的作業。
$ at -f work 10am Jul 31
在7月31日上午10點執行檔案work中的作業。
在任何情況下,超級使用者都可以使用這個命令。對於其他使用者來說,是否可以使用就取決於兩個檔案:/etc/at.allow和/etc/at.deny。如果/etc/at.allow檔案存在的話,那麼只有在其中列出的使用者才可以使用at命令;如果該檔案不存在,那麼將檢查/etc/at.deny檔案是否存在,在這個檔案中列出的使用者均不能使用該命令。如果兩個檔案都不存在,那麼只有超級使用者可以使用該命令;空的/etc/at.deny檔案意味著所有的使用者都可以使用該命令,這也是預設狀態。
下面對命令中的引數進行說明。
-V 將標準版本號列印到標準錯誤中。
-q queue 使用指定的佇列。佇列名稱是由單個字母組成,合法的佇列名可以由a-z或者A-Z。a佇列是at命令的預設佇列。
-m 作業結束後傳送郵件給執行at命令的使用者。
-f file 使用該選項將使命令從指定的file讀取,而不是從標準輸入讀取。
-l atq命令的一個別名。該命令用於檢視安排的作業序列,它將列出使用者排在佇列中的作業,如果是超級使用者,則列出佇列中的所有工作。
命令的語法格式如下:
atq [-V] [-q 佇列] [-v]
-d atrm 命令的一個別名。該命令用於刪除指定要執行的命令序列,語法格式如下:
atrm [-V] 作業 [作業...]
-c 將命令列上所列的作業送到標準輸出。
[例4] 找出系統中所有以txt為字尾名的檔案,並且進行列印。列印結束後給使用者foxy發出郵件通知取件。指定時間為十二月二十五日凌晨兩點。
首先鍵入:
$ at 2:00 12/25/99
然後系統出現at>提示符,等待使用者輸入進一步的資訊,也就是需要執行的命令序列:
at> find / -name “*.txt”|lpr
at> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy
輸入完每一行指令然後回車,所有指令序列輸入完畢後,使用組合鍵結束at命令的輸入。這時候螢幕將出現如下資訊:
warning:command will be executed using /bin/sh.
job 1 at 1999-12-25 02:00
提醒使用者將使用哪個shell來執行該命令序列。
實際上如果命令序列較長或者經常被執行的時候,一般都採用將該序列寫到一個檔案中,然後將檔案作為at命令的輸入來處理。這樣不容易出錯。
[例5] 上面的例子可以修改如下:
將命令序列寫入到檔案/tmp/printjob,語句為:
$ at -f /tmp/printjob 2:00 12/25/99
這樣一來,at命令將使用檔案中的命令序列,螢幕顯示如下:
Warning:command will be executed using /bin/sh.
job 2 at 1999-12-25 02:00
當然也可以採用以下命令:
$ at find / -name *.txt|lpr
at> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy
現在這個命令就會在合適的時間進行了,進行完後會發回一個資訊。
仍然使用組合鍵來結束命令輸入。而且batch和at命令都將自動轉入後臺,所以啟動的時候也不需要加上&符號。
cron命令
前面介紹的兩條命令都會在一定時間內完成一定任務,但是要注意它們都只能執行一次。也就是說,當指定了執行命令後,系統在指定時間完成任務,一切就結束了。但是在很多時候需要不斷重複一些命令,比如:某公司每週一自動向員工報告頭一週公司的活動情況,這時候就需要使用cron命令來完成任務了。
實際上,cron命令是不應該手工啟動的。cron命令在系統啟動時就由一個shell指令碼自動啟動,進入後臺(所以不需要使用&符號)。一般的使用者沒有執行該命令的許可權,雖然超級使用者可以手工啟動cron,不過還是建議將其放到shell指令碼中由系統自行啟動。
首先cron命令會搜尋/var/spool/cron目錄,尋找以/etc/passwd檔案中的使用者名稱命名的crontab檔案,被找到的這種檔案將載入記憶體。例如一個使用者名稱為foxy的使用者,它所對應的crontab檔案就應該是/var/spool/cron/foxy。也就是說,以該使用者命名的crontab檔案存放在/var/spool/cron目錄下面。cron命令還將搜尋/etc/crontab檔案,這個檔案是用不同的格式寫成的。
cron啟動以後,它將首先檢查是否有使用者設定了crontab檔案,如果沒有就轉入“休眠”狀態,釋放系統資源。所以該後臺程式佔用資源極少。它每分鐘“醒”過來一次,檢視當前是否有需要執行的命令。命令執行結束後,任何輸出都將作為郵件傳送給crontab的所有者,或者是/etc/crontab檔案中MAILTO環境變數中指定的使用者。
上面簡單介紹了一些cron的工作原理,但是cron命令的執行不需要使用者干涉;需要使用者修改的是crontab中要執行的命令序列,所以下面介紹crontab命令。
crontab命令
crontab命令用於安裝、刪除或者列出用於驅動cron後臺程式的表格。也就是說,使用者把需要執行的命令序列放到crontab檔案中以獲得執行。每個使用者都可以有自己的crontab檔案。下面就來看看如何建立一個crontab檔案。
在/var/spool/cron下的crontab檔案不可以直接建立或者直接修改。crontab檔案是透過crontab命令得到的。現在假設有個使用者名稱為foxy,需要建立自己的一個crontab檔案。首先可以使用任何文字編輯器建立一個新檔案,然後向其中寫入需要執行的命令和要定期執行的時間。
然後存檔退出。假設該檔案為/tmp/test.cron。再後就是使用crontab命令來安裝這個檔案,使之成為該使用者的crontab檔案。鍵入:
crontab test.cron
這樣一個crontab 檔案就建立好了。可以轉到/var/spool/cron目錄下面檢視,發現多了一個foxy檔案。這個檔案就是所需的crontab 檔案。用more命令檢視該檔案的內容可以發現檔案頭有三行資訊:
#DO NOT EDIT THIS FILE -edit the master and reinstall.
#(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是:
#切勿編輯此檔案——如果需要改變請編輯原始檔然後重新安裝。
#test.cron檔案安裝時間:14:20:20 02/22/1999
如果需要改變其中的命令內容時,還是需要重新編輯原來的檔案,然後再使用crontab命令安裝。
可以使用crontab命令的使用者是有限制的。如果/etc/cron.allow檔案存在,那麼只有其中列出的使用者才能使用該命令;如果該檔案不存在但cron.deny檔案存在,那麼只有未列在該檔案中的使用者才能使用crontab命令;如果兩個檔案都不存在,那就取決於一些引數的設定,可能是隻允許超級使用者使用該命令,也可能是所有使用者都可以使用該命令。
crontab命令的語法格式如下:
crontab [-u user] file
crontab [-u user]{-l|-r|-e}
第一種格式用於安裝一個新的crontab 檔案,安裝來源就是file所指的檔案,如果使用“-”符號作為檔名,那就意味著使用標準輸入作為安裝來源。
-u 如果使用該選項,也就是指定了是哪個具體使用者的crontab 檔案將被修改。如果不指定該選項,crontab 將預設是操作者本人的crontab ,也就是執行該crontab 命令的使用者的crontab 檔案將被修改。但是請注意,如果使用了su命令再使用crontab 命令很可能就會出現混亂的情況。所以如果是使用了su命令,最好使用-u選項來指定究竟是哪個使用者的crontab檔案。
-l 在標準輸出上顯示當前的crontab。
-r 刪除當前的crontab檔案。
-e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab檔案。當結束編輯離開時,編輯後的檔案將自動安裝。
[例7]
# crontab -l #列出使用者目前的crontab。
10 6 * * * date
0 */2 * * * date
0 23-7/2,8 * * * date
#
在crontab檔案中如何輸入需要執行的命令和時間。該檔案中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
第一項是分鐘,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一週的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果使用者不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字元,所以就可以認為是任何時間,也就是該項被忽略了。在表4-1中給出了每項的合法範圍。
表4-1 指定時間的合法範圍
時間
合法值
minute
00-59
hour
00-23,其中00點就是晚上12點
day-of-month
01-31
month-of-year
01-12
day-of-week
0-6,其中週日是0
這樣使用者就可以往crontab 檔案中寫入無限多的行以完成無限多的命令。命令域中可以寫入所有可以在命令列寫入的命令和符號,其他所有時間域都支援列舉,也就是域中可以寫入很多的時間值,只要滿足這些時間值中的任何一個都執行命令,每兩個時間值中間使用逗號分隔。
[例8]
5,15,25,35,45,55 16,17,18 * * * command
這就是表示任意天任意月,其實就是每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
[例9] 在每週一,三,五的下午3:00系統進入維護狀態,重新啟動系統。那麼在crontab 檔案中就應該寫入如下欄位:
00 15 * * 1,3,5 shutdown -r +5
然後將該檔案存檔為foxy.cron,再鍵入crontab foxy.cron安裝該檔案。
[例10] 每小時的10分,40分執行使用者目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
[例11] 每小時的1分執行使用者目錄下的bin/account這個指令:
1 * * * * bin/account
[例12] 每天早晨三點二十分執行使用者目錄下如下所示的兩個指令(每個指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)
[例13] 每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果新增在mm.txt這個檔案之後(mm.txt檔案位於使用者自己的目錄位置)。
12,55 3 4-9 1,4 * /bin/rm -f expire.1st>>mm.txt
[例14] 我們來看一個超級使用者的crontab檔案:
#Run the ‘atrun' program every minutes
#This runs anything that's due to run from ‘at'.See man ‘at' or ‘atrun'.
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
40 7 * * * updatedb
8,10,22,30,39,46,54,58 * * * * /bin/sync
程式的掛起及恢復命令bg、fg
作業控制允許將程式掛起並可以在需要時恢復程式的執行,被掛起的作業恢復後將從中止處開始繼續執行。只要在鍵盤上按,即可掛起當前的前臺作業。
[例15]
$ cat > text.file
[1] + stopped cat > text.file
$ jobs
[1]+ stopped cat > text.file
在鍵盤上按後,將掛起當前執行的命令cat。使用jobs命令可以顯示shell的作業清單,包括具體的作業、作業號以及作業當前所處的狀態。
恢復程式執行時,有兩種選擇:用fg命令將掛起的作業放回到前臺執行;用bg命令將掛起的作業放到後臺執行。
[例16] 使用者正在使用Emacs,突然需要檢視系統程式情況。就首先使用組合鍵將Emacs程式掛起,然後使用bg命令將其在後臺啟動,這樣就得到了前臺的操作控制權,接著鍵入“ps –x”檢視程式情況。檢視完畢後,使用fg命令將Emacs帶回前臺執行即可。其命令格式為:
$ bg emacs
$ ps –x
$ fg emacs
預設情況下,fg和bg命令對最近停止的作業進行操作。如果希望恢復其他作業的執行,可以在命令中指定要恢復作業的作業號來恢復該作業。例如:
$ fg 1
cat > text.file
靈活使用上述命令,將給自己帶來很大的方便。
本節中要介紹的不只是程式檢視方面的內容,由於Linux是個多使用者系統,有時候也要了解其他使用者現在在幹什麼,所以在本節中還將接觸多使用者方面的內容。同時Linux是一個多程式系統,經常需要對這些程式進行一些調配和管理;而要進行管理,首先就要知道現在的程式情況:究竟有哪些程式?程式情況如何?等等。所以需要程式檢視方面的工作。 who命令 該命令主要用於檢視當前線上上的使用者情況。這個命令非常有用。如果使用者想和其他使用者建立即時通訊,比如使用talk命令,那麼首先要確定的就是該使用者確實線上上,不然talk程式就無法建立起來。又如,系統管理員希望監視每個登入的使用者此時此刻的所作所為,也要使用who命令。 who命令的常用語法格式如下: who [imqsuwHT] [--count] [--idle] [--heading] [--help] [--message] [--mesg] [--version] [--writable] [file] [am i] 所有的選項都是可選的,也就是說可以單獨使用who命令。不使用任何選項時,who命令將顯示以下三項內容: login name:登入使用者名稱; terminal line:使用終端裝置; login time:登入到系統的時間。 如果給出的是兩個非選項引數,那麼who命令將只顯示執行who程式的使用者名稱、登入終端和登入時間。通常這兩個引數是“am i”,即該命令格式為:“who am i”。 下面對who命令的常用引數進行說明。 -m 和“who am i”的作用一樣,顯示執行該程式的使用者名稱。 -q,--count 只顯示使用者的登入帳號和登入使用者的數量,該選項優先順序高於其他任何選項。 -s 忽略。主要是用於和其他版本的who命令相容。 -i,-u,--idle 在登入時間後面顯示該使用者最後一次對系統進行操作至今的時間,也就是常說的“發呆”時間。其中“.”符號代表該使用者在前1秒仍然處於活動狀態;“old”則表示該使用者空閒已經超過了24小時。 -H,--heading 顯示一行列標題。常用的標題如表4-2所示。 表4-2 who命令輸出常用標題 標 題 說 明 USER 使用者登入帳號 LINE 使用者登入使用終端 LOGIN-TIME 使用者登入時間 IDLE 使用者空閒時間,即未進行操作的時間 PID 使用者登入shell的程式ID FROM 使用者網路地址 -w,-T--mesg,--message,--writable 和-s選項一樣,在登入帳號後面顯示一個字元來表示使用者的資訊狀態: +:允許寫資訊; -:不允許寫資訊; ?:不能找到終端裝置。 --help 在標準輸出上顯示幫助資訊。 --version 在標準輸出上顯示版本資訊。 下面介紹who命令的一些基本用法。 如果需要檢視在系統上究竟有哪些使用者,可以直接使用who命令。 [例17] 檢視登入到系統的使用者情況 $ who root tty1 Mar 17 13:49 foxy tty2 Mar 17 13:49 root tty3 Mar 17 13:49 bbs ttyp0 Mar 17 13:49 (river.net) 可以看到,現在系統一共有四個使用者。第一列是登入使用者的帳號;第二列是登入所使用的終端;第三列是登入時間;第四列是使用者從什麼地方登入的網路地址,這裡是域名。 一般來說,這樣就可以瞭解登入使用者的大致情況了。但有時上面的顯示不是那麼直觀,因為沒有標題說明,不容易看懂,這時就需要使用-H選項了。 [例18] 檢視登入使用者的詳細情況,鍵入: $ who -uH 顯示如下: USER LINE LOGIN-TIME IDLE FROM root tty1 Mar 17 13:49 . foxy tty2 Mar 17 13:49 00:01 root tty3 Mar 17 13:49 00:01 bbs ttyp0 Mar 17 13:49 00:01 (river.net) 這樣一目瞭然。其中-u選項指定顯示使用者空閒時間,所以可以看到多了一項IDLE。第一個root使用者的IDLE項是一個“.”,這就說明該使用者在前1秒仍然是活動的,而其他使用者後面都有一個時間,稱為空閒時間。 最後來看看使用“who am i”格式命令的結果: 233.river.net!root tty1 Mar 17 13:49 可見只顯示出了執行該who命令的使用者情況,當然這時候不存在空閒時間。 who命令應用起來非常簡單,可以比較準確地掌握使用者的情況,所以使用非常廣泛。 w命令 該命令也用於顯示登入到系統的使用者情況,但是與who不同的是,w命令功能更加強大,它不但可以顯示有誰登入到系統,還可以顯示出這些使用者當前正在進行的工作,並且統計資料相對who命令來說更加詳細和科學,可以認為w命令就是who命令的一個增強版。 w命令的顯示專案按以下順序排列:當前時間,系統啟動到現在的時間,登入使用者的數目,系統在最近1秒、5秒和15秒的平均負載。然後是每個使用者的各項資料,專案顯示順序如下:登入帳號、終端名稱、遠端主機名、登入時間、空閒時間、JCPU、PCPU、當前正在執行程式的命令列。 其中JCPU時間指的是和該終端(tty)連線的所有程式佔用的時間。這個時間裡並不包括過去的後臺作業時間,但卻包括當前正在執行的後臺作業所佔用的時間。而PCPU時間則是指當前程式(即在WHAT項中顯示的程式)所佔用的時間。下面介紹該命令的具體用法和引數。 語法格式如下: w -[husfV] [user] 下面對引數進行說明: -h 不顯示標題。 -u 當列出當前程式和CPU時間時忽略使用者名稱。這主要是用於執行su命令後的情況。 -s 使用短模式。不顯示登入時間、JCPU和PCPU時間。 -f 切換顯示FROM項,也就是遠端主機名項。預設值是不顯示遠端主機名,當然系統管理員可以對原始檔作一些修改使得顯示該項成為預設值。 -V 顯示版本資訊。 User 只顯示指定使用者的相關情況。 [例19] 顯示當前登入到系統的使用者的詳細情況 $ w 2:50pm up 2 min, 4 users, load average:0.22,0.16,0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 2:49pm 0:00s 0.56s 0.10s w foxy tty2 2:49pm 1:09 0.42s 0.42s bash root tty3 2:49pm 46.00s 0.67s 0.25s telnet bbs3 bbs ttyp0 river.net 2:49pm 45.00s 0.49s 0.49s bbs h river.net ps命令 1. ps簡介 前面介紹的兩個命令都是用於檢視當前系統使用者的情況,下面就來看看程式的情況,這也是本章的主題。要對程式進行監測和控制,首先必須要了解當前程式的情況,也就是需要檢視當前程式,而ps命令就是最基本同時也是非常強大的程式檢視命令。使用該命令可以確定有哪些程式正在執行和執行的狀態、程式是否結束、程式有沒有僵死、哪些程式佔用了過多的資源等等。總之大部分資訊都是可以透過執行該命令得到的。 2. ps命令及其引數 ps命令最常用的還是用於監控後臺程式的工作情況,因為後臺程式是不和螢幕鍵盤這些標準輸入/輸出裝置進行通訊的,所以如果需要檢測其情況,便可以使用ps命令了。 該命令語法格式如下: ps [選項] 下面對命令選項進行說明: -e 顯示所有程式。 -f 全格式。 -h 不顯示標題。 -l 長格式。 -w 寬輸出。 a 顯示終端上的所有程式,包括其他使用者的程式。 r 只顯示正在執行的程式。 x 顯示沒有控制終端的程式。 O[+|-] k1 [,[+|-] k2 [,…]] 根據SHORT KEYS、k1、k2中快捷鍵指定的多級排序順序顯示程式列表。對於ps的不同格式都存在著預設的順序指定。這些預設順序可以被使用者的指定所覆蓋。其中“+”字元是可選的,“-”字元是倒轉指定鍵的方向。 pids 只列出指定程式的情況。各程式ID之間使用逗號分隔。該程式列表必須在命令列引數的最後一個選項後面緊接著給出,中間不能插入空格。比如:ps -f1,4,5。 以下介紹長命令列選項,這些選項都使用“--”開頭: --sort X[+|-] key [,[+|-] key [,…]] 從SORT KEYS段中選一個多字母鍵。“+”字元是可選的,因為預設的方向就是按數字升序或者詞典順序。比如: ps -jax -sort=uid,-ppid,+pid。 --help 顯示幫助資訊。 --version 顯示該命令的版本資訊。 在前面的選項說明中提到了排序鍵,接下來對排序鍵作進一步說明。需要注意的是排序中使用的值是ps使用的內部值,並非僅用於某些輸出格式的偽值。排序鍵列表見表4-3。 表4-3 排序鍵列表 短格式 長格式 說 明 c cmd 可執行的簡單名稱 C cmdline 完整命令列 f flags 長模式標誌 g pgrp 程式的組ID G tpgid 控制tty程式組ID j cutime 累計使用者時間 J cstime 累計系統時間 k utime 使用者時間 K stime 系統時間 m min_flt 次要頁錯誤的數量 M maj_flt 主要頁錯誤的數量 n cmin_flt 累計次要頁錯誤 N cmaj_flt 累計主要頁錯誤 o session 對話ID p pid 程式ID P ppid 父程式ID r rss 駐留大小 R resident 駐留頁 s size 記憶體大小(千位元組) S share 共享頁的數量 t tty tty次要裝置號 T start_time 程式啟動的時間 U uid UID u user 使用者名稱 v vsize 總的虛擬記憶體數量(位元組) y priority 核心排程優先順序 3. 常用ps命令引數 前面兩節介紹的引數可能讓讀者覺得有些可怕,實際上這是一個非常容易使用的命令,一般的使用者只需掌握一些最常用的命令引數就可以了。 最常用的三個引數是u、a、x,下面將透過例子來說明其具體用法。 [例20] 以root身份登入系統,檢視當前程式狀況 $ ps PID TTY TIME COMMAND 5800 ttyp0 00:00:00 bash 5835 ttyp0 00:00:00 ps 可以看到,顯示的專案共分為四項,依次為PID(程式ID)、TTY(終端名稱)、TIME(程式執行時間)、COMMAND(該程式的命令列輸入)。 可以使用u選項來檢視程式所有者及其他一些詳細資訊,如下所示: $ ps u USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u 在bash程式前面有條橫線,意味著該程式便是使用者的登入shell,所以對於一個登入使用者來說帶短橫線的程式只有一個。還可以看到%CPU、%MEM兩個選項,前者指該程式佔用的CPU時間和總時間的百分比;後者指該程式佔用的記憶體和總記憶體的百分比。 在這種情況下看到了所有控制終端的程式;但是對於其他那些沒有控制終端的程式還是沒有觀察到,所以這時就需要使用x選項。使用x選項可以觀察到所有的程式情況。 [例21] 下面是使用x選項的例子: $ ps x PID TTY STAT TIME COMMAND 5800 ttyp0 S 0:00 -bash 5813 ttyp1 S 0:00 -bash 5921 ttyp0 S 0:00 man ps 5922 ttyp0 S 0:00 sh -c /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz | / 5923 ttyp0 S 0:00 /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz 5924 ttyp0 S 0:00 /usr/bin/less -is 5941 ttyp1 R 0:00 ps x 可以發現突然一下子就多出了那麼多的程式。這些多出來的程式就是沒有控制終端的程式。 前面看到的所有程式都是test使用者自己的。其實還有許多其他使用者在使用著系統,自然也就對應著其他的很多程式。如果想對這些程式有所瞭解,可以使用a選項來檢視當前系統所有使用者的所有程式。經常使用的是aux組合選項,這可以顯示最詳細的程式情況。 [例22] $ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1136 64 ? S Nov25 0:02 init [3] root 2 0.0 0.0 0 0 ? SW Nov25 0:00 [kflushd] root 3 0.0 0.0 0 0 ? SW Nov25 0:03 [kupdate] root 4 0.0 0.0 0 0 ? SW Nov25 0:00 [kpiod] root 5 0.0 0.0 0 0 ? SW Nov25 0:00 [kswapd] root 163 0.0 0.1 1628 332 ? S Nov25 0:02 sshd root 173 0.0 0.0 1324 200 ? S Nov25 0:00 syslogd root 181 0.0 0.0 1420 0 ? SW Nov25 0:00 [klogd] daemon 191 0.0 0.1 1160 312 ? S Nov25 0:00 /usr/sbin/atd root 201 0.0 0.1 1348 492 ? S Nov25 0:00 crond root 212 0.0 0.0 1292 68 ? S Nov25 0:00 inetd …… 在顯示的最前面是其他使用者的程式情況,可以看到有root、daemon等使用者以及他們所啟動的程式。 在上面的例子中,介紹了ps命令最常見的一些選項和選項組合,使用者可以根據自己的需要選用。 top命令 top命令和ps命令的基本作用是相同的,顯示系統當前的程式和其他狀況;但是top是一個動態顯示過程,即可以透過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它將獨佔前臺,直到使用者終止該程式為止。 比較準確的說,top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最“敏感”的任務列表。該命令可以按CPU使用。記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以透過互動式命令或者在個人定製檔案中進行設定。在後面的介紹中將把命令引數和互動命令分開講述。 下面是該命令的語法格式: top [-] [d delay] [q] [c] [s] [S] [i] d 指定每兩次螢幕資訊重新整理之間的時間間隔。當然使用者可以使用s互動命令來改變之。 q 該選項將使top沒有任何延遲的進行重新整理。如果呼叫程式有超級使用者許可權,那麼top將以儘可能高的優先順序執行。 S 指定累計模式。 s 使top命令在安全模式中執行。這將去除互動命令所帶來的潛在危險。 i 使top不顯示任何閒置或者僵死程式。 c 顯示整個命令列而不只是顯示命令名 top命令顯示的專案很多,預設值是每5秒更新一次,當然這是可以設定的。顯示的各專案為: uptime 該項顯示的是系統啟動時間、已經執行的時間和三個平均負載值(最近1秒,5秒,15秒的負載值)。 processes 自最近一次重新整理以來的執行程式總數。當然這些程式被分為正在執行的,休眠的,停止的等很多種類。程式和狀態顯示可以透過互動命令t來實現。 CPU states 顯示使用者模式,系統模式,優先順序程式(只有優先順序為負的列入考慮)和閒置等各種情況所佔用CPU時間的百分比。優先順序程式所消耗的時間也被列入到使用者和系統的時間中,所以總的百分比將大於100%。 Mem 記憶體使用情況統計,其中包括總的可用記憶體,空閒記憶體,已用記憶體,共享記憶體和快取所佔記憶體的情況。 Swap 交換空間統計,其中包括總的交換空間,可用交換空間,已用交換空間。 PID 每個程式的ID。 PPID 每個程式的父程式ID。 UID 每個程式所有者的UID 。 USER 每個程式所有者的使用者名稱。 PRI 每個程式的優先順序別。 NI 該程式的優先順序值。 SIZE 該程式的程式碼大小加上資料大小再加上堆疊空間大小的總數。單位是KB。 TSIZE 該程式的程式碼大小。對於核心程式這是一個很奇怪的值。 DSIZE 資料和堆疊的大小。 TRS 文字駐留大小。 D 被標記為“不乾淨”的頁專案。 LIB 使用的庫頁的大小。對於ELF程式沒有作用。 RSS 該程式佔用的實體記憶體的總數量,單位是KB。 SHARE 該程式使用共享記憶體的數量。 STAT 該程式的狀態。其中S代表休眠狀態;D代表不可中斷的休眠狀態;R代表執行狀態;Z代表僵死狀態;T代表停止或跟蹤狀態。 TIME 該程式自啟動以來所佔用的總CPU時間。如果進入的是累計模式,那麼該時間還包括這個程式子程式所佔用的時間。且標題會變成CTIME。 %CPU 該程式自最近一次重新整理以來所佔用的CPU時間和總時間的百分比。 %MEM 該程式佔用的實體記憶體佔總記憶體的百分比。 COMMAND 該程式的命令名稱,如果一行顯示不下,則會進行擷取。記憶體中的程式會有一個完整的命令列。 下面介紹在top命令執行過程中可以使用的一些互動命令。從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令列選項中使用了s選項,則可能其中一些命令會被遮蔽掉。 立即重新整理顯示。 Ctrl+L 擦除並且重寫螢幕。 h或者? 顯示幫助畫面,給出一些簡短的命令總結說明。 k 終止一個程式。系統將提示使用者輸入需要終止的程式PID,以及需要傳送給該程式什麼樣的訊號。一般的終止程式可以使用15訊號;如果不能正常結束那就使用訊號9強制結束該程式。預設值是訊號15。在安全模式中此命令被遮蔽。 i 忽略閒置和僵死程式。這是一個開關式命令。 q 退出程式。 r 重新安排一個程式的優先順序別。系統提示使用者輸入需要改變的程式PID以及需要設定的程式優先順序值。輸入一個正值將使優先順序降低,反之則可以使該程式擁有更高的優先權。預設值是10。 S 切換到累計模式。 s 改變兩次重新整理之間的延遲時間。系統將提示使用者輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s。需要注意的是如果設定太小的時間,很可能會引起不斷重新整理,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。 f或者F 從當前顯示中新增或者刪除專案。 o或者O 改變顯示專案的順序。 l 切換顯示平均負載和啟動時間資訊。 m 切換顯示記憶體資訊。 t 切換顯示程式和CPU狀態資訊。 c 切換顯示命令名稱和完整命令列。 M 根據駐留記憶體大小進行排序。 P 根據CPU使用百分比大小進行排序。 T 根據時間/累計時間進行排序。 W 將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法。 從上面的介紹中可以看到,top命令是一個功能十分強大的監控系統的工具,尤其對於系統管理員而言更是如此。一般的使用者可能會覺得ps命令其實就夠用了,但是top命令的強勁功能確實提供了不少方便。下面來看看實際使用的情況。 [例23] 鍵入top命令檢視系統狀況 $ top 1:55pm up 7 min, 4 user, load average:0.07,0.09,0.06 29 processes:28 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 4.5% user, 3.6% system, 0.0% nice, 91.9% idle Mem: 38916K av, 18564K used, 20352K free, 11660K shrd, 1220K buff Swap: 33228K av, 0K used, 33228K free, 11820K cached PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND 363 root 14 0 708 708 552 R 0 8.1 1.8 0:00 top 1 root 0 0 404 404 344 S 0 0.0 1.0 0:03 init 2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd 3 root -12 -12 0 0 0 SW
程式及作業的概念
Linux是一個多使用者多工的作業系統。多使用者是指多個使用者可以在同一時間使用計算機系統;多工是指Linux可以同時執行幾個任務,它可以在還未執行完一個任務時又執行另一項任務。
作業系統管理多個使用者的請求和多個任務。大多數系統都只有一個CPU和一個主存,但一個系統可能有多個二級儲存磁碟和多個輸入/輸出裝置。作業系統管理這些資源並在多個使用者間共享資源,當您提出一個請求時,給您造成一種假象,好象系統只被您獨自佔用。而實際上作業系統監控著一個等待執行的任務佇列,這些任務包括使用者作業、作業系統任務、郵件和列印作業等。作業系統根據每個任務的優先順序為每個任務分配合適的時間片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經足夠計算機完成成千上萬的指令集。每個任務都會被系統執行一段時間,然後掛起,系統轉而處理其他任務;過一段時間以後再回來處理這個任務,直到某個任務完成,從任務佇列中去除。
Linux系統上所有執行的東西都可以稱之為一個程式。每個使用者任務、每個系統管理守護程式,都可以稱之為程式。Linux用分時管理方法使所有的任務共同分享系統資源。我們討論程式的時候,不會去關心這些程式究竟是如何分配的,或者是核心如何管理分配時間片的,我們所關心的是如何去控制這些程式,讓它們能夠很好地為使用者服務。
程式的一個比較正式的定義是:在自身的虛擬地址空間執行的一個單獨的程式。程式與程式是有區別的,程式不是程式,雖然它由程式產生。程式只是一個靜態的指令集合,不佔系統的執行資源;而程式是一個隨時都可能發生變化的、動態的、使用系統執行資源的程式。而且一個程式可以啟動多個程式。
Linux作業系統包括三種不同型別的程式,每種程式都有自己的特點和屬性。
互動程式——由一個shell啟動的程式。互動程式既可以在前臺執行,也可以在後臺執行。
批處理程式——這種程式和終端沒有聯絡,是一個程式序列。
監控程式(也稱守護程式)——Linux系統啟動時啟動的程式,並在後臺執行。
上述三種程式各有各的作用,使用場合也有所不同。
程式和作業的概念也有區別。一個正在執行的程式稱為一個作業,而且作業可以包含一個或多個程式,尤其是當使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”這個作業就同時啟動了三個程式。
作業控制指的是控制正在執行的程式的行為。比如,使用者可以掛起一個程式,等一會兒再繼續執行該程式。shell將記錄所有啟動的程式情況,在每個程式過程中,使用者可以任意地掛起程式或重新啟動程式。作業控制是許多shell(包括bash和tcsh)的一個特性,使使用者能在多個獨立作業間進行切換。
一般而言,程式與作業控制相關聯時,才被稱為作業。
在大多數情況下,使用者在同一時間只執行一個作業,即它們最後向shell鍵入的命令。但是使用作業控制,使用者可以同時執行多個作業,並在需要時在這些作業間進行切換。這會有什麼用途呢?例如,當使用者編輯一個文字檔案,並需要中止編輯做其他事情時,利用作業控制,使用者可以讓編輯器暫時掛起,返回shell提示符開始做其他的事情。其他事情做完以後,使用者可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象使用者從來沒有離開編輯器一樣。這只是一個例子,作業控制還有許多其他實際的用途。
啟動程式
鍵入需要執行的程式的程式名,執行一個程式,其實也就是啟動了一個程式。在Linux系統中每個程式都具有一個程式號,用於系統識別和排程程式。啟動一個程式有兩個主要途徑:手工啟動和排程啟動,後者是事先進行設定,根據使用者要求自行啟動。
手工啟動
由使用者輸入命令,直接啟動一個程式便是手工啟動程式。但手工啟動程式又可以分為很多種,根據啟動的程式型別不同、性質不同,實際結果也不一樣,下面分別介紹。
1. 前臺啟動
這或許是手工啟動一個程式的最常用的方式。一般地,使用者鍵入一個命令“ls –l”,這就已經啟動了一個程式,而且是一個前臺的程式。這時候系統其實已經處於一個多程式狀態。或許有些使用者會疑惑:我只啟動了一個程式而已。但實際上有許多執行在後臺的、系統啟動時就已經自動啟動的程式正在悄悄執行著。還有的使用者在鍵入“ls –l”命令以後趕緊使用“ps –x”檢視,卻沒有看到ls程式,也覺得很奇怪。其實這是因為ls這個程式結束太快,使用ps檢視時該程式已經執行結束了。如果啟動一個比較耗時的程式:
find / -name fox.jpg
然後再把該程式掛起,使用ps檢視,就會看到一個find程式在裡面。
2. 後臺啟動
直接從後臺手工啟動一個程式用得比較少一些,除非是該程式甚為耗時,且使用者也不急著需要結果的時候。假設使用者要啟動一個需要長時間執行的格式化文字檔案的程式。為了不使整個shell在格式化過程中都處於“癱瘓”狀態,從後臺啟動這個程式是明智的選擇。
[例1]
$ troff –me notes > note_form &
[1] 4513
$
由上例可見,從後臺啟動程式其實就是在命令結尾加上一個&號。鍵入命令以後,出現一個數字,這個數字就是該程式的編號,也稱為PID,然後就出現了提示符。使用者可以繼續其他工作。
上面介紹了前、後臺啟動的兩種情況。實際上這兩種啟動方式有個共同的特點,就是新程式都是由當前shell這個程式產生的。也就是說,是shell建立了新程式,於是就稱這種關係為程式間的父子關係。這裡shell是父程式,而新程式是子程式。一個父程式可以有多個子程式,一般地,子程式結束後才能繼續父程式;當然如果是從後臺啟動,那就不用等待子程式結束了。
一種比較特殊的情況是在使用管道符的時候。例如:
nroff -man ps.1|grep kill|more
這時候實際上是同時啟動了三個程式。請注意是同時啟動的,所有放在管道兩邊的程式都將被同時啟動,它們都是當前shell的子程式,互相之間可以稱為兄弟程式。
以上介紹的是手工啟動程式的一些內容,作為一名系統管理員,很多時候都需要把事情安排好以後讓其自動執行。因為管理員不是機器,也有離開的時候,所以有些必須要做的工作而恰好管理員不能親自操作,這時候就需要使用排程啟動程式了。
排程啟動
有時候需要對系統進行一些比較費時而且佔用資源的維護工作,這些工作適合在深夜進行,這時候使用者就可以事先進行排程安排,指定任務執行的時間或者場合,到時候系統會自動完成這一切工作。
要使用自動啟動程式的功能,就需要掌握以下幾個啟動命令。
at命令
使用者使用at命令在指定時刻執行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執行時間才可以正常執行。at命令可以只指定時間,也可以時間和日期一起指定。需要注意的是,指定時間有個系統判別問題。比如說:使用者現在指定了一個執行時間:凌晨3:20,而發出at命令的時間是頭天晚上的20:00,那麼究竟是在哪一天執行該命令呢?如果使用者在3:20以前仍然在工作,那麼該命令將在這個時候完成;如果使用者3:20以前就退出了工作狀態,那麼該命令將在第二天凌晨才得到執行。下面是at命令的語法格式:
at [-V] [-q 佇列] [-f 檔名] [-mldbv] 時間
at -c 作業 [作業...]
at允許使用一套相當複雜的指定時間的方法,實際上是將POSIX.2標準擴充套件了。它可以接受在當天的hh:mm(小時:分鐘)式的時間指定。如果該時間已經過去,那麼就放在第二天執行。當然也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的詞語來指定時間。使用者還可以採用12小時計時制,即在時間後面加上AM(上午)或者PM(下午)來說明是上午還是下午。
也可以指定命令執行的具體日期,指定格式為month day(月 日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式為:now + count time-units ,now就是當前時間,time-units是時間單位,這裡可以是 minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。
還有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。下面透過一些例子來說明具體用法。
[例2] 指定在今天下午5:30執行某命令。假設現在時間是中午12:30,1999年2月24日,其命令格式如下:
at 5:30pm
at 17:30
at 17:30 today
at now + 5 hours
at now + 300 minutes
at 17:30 24.2.99
at 17:30 2/24/99
at 17:30 Feb 24
以上這些命令表達的意義是完全一樣的,所以在安排時間的時候完全可以根據個人喜好和具體情況自由選擇。一般採用絕對時間的24小時計時法可以避免由於使用者自己的疏忽造成計時錯誤的情況發生,例如上例可以寫成:
at 17:30 2/24/99
這樣非常清楚,而且別人也看得懂。
對於at命令來說,需要定時執行的命令是從標準輸入或者使用-f選項指定的檔案中讀取並執行的。如果at命令是從一個使用su命令切換到使用者shell中執行的,那麼當前使用者被認為是執行使用者,所有的錯誤和輸出結果都會送給這個使用者。但是如果有郵件送出的話,收到郵件的將是原來的使用者,也就是登入時shell的所有者。
[例3]
$ at -f work 4pm + 3 days
在三天後下午4點執行檔案work中的作業。
$ at -f work 10am Jul 31
在7月31日上午10點執行檔案work中的作業。
在任何情況下,超級使用者都可以使用這個命令。對於其他使用者來說,是否可以使用就取決於兩個檔案:/etc/at.allow和/etc/at.deny。如果/etc/at.allow檔案存在的話,那麼只有在其中列出的使用者才可以使用at命令;如果該檔案不存在,那麼將檢查/etc/at.deny檔案是否存在,在這個檔案中列出的使用者均不能使用該命令。如果兩個檔案都不存在,那麼只有超級使用者可以使用該命令;空的/etc/at.deny檔案意味著所有的使用者都可以使用該命令,這也是預設狀態。
下面對命令中的引數進行說明。
-V 將標準版本號列印到標準錯誤中。
-q queue 使用指定的佇列。佇列名稱是由單個字母組成,合法的佇列名可以由a-z或者A-Z。a佇列是at命令的預設佇列。
-m 作業結束後傳送郵件給執行at命令的使用者。
-f file 使用該選項將使命令從指定的file讀取,而不是從標準輸入讀取。
-l atq命令的一個別名。該命令用於檢視安排的作業序列,它將列出使用者排在佇列中的作業,如果是超級使用者,則列出佇列中的所有工作。
命令的語法格式如下:
atq [-V] [-q 佇列] [-v]
-d atrm 命令的一個別名。該命令用於刪除指定要執行的命令序列,語法格式如下:
atrm [-V] 作業 [作業...]
-c 將命令列上所列的作業送到標準輸出。
[例4] 找出系統中所有以txt為字尾名的檔案,並且進行列印。列印結束後給使用者foxy發出郵件通知取件。指定時間為十二月二十五日凌晨兩點。
首先鍵入:
$ at 2:00 12/25/99
然後系統出現at>提示符,等待使用者輸入進一步的資訊,也就是需要執行的命令序列:
at> find / -name “*.txt”|lpr
at> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy
輸入完每一行指令然後回車,所有指令序列輸入完畢後,使用組合鍵結束at命令的輸入。這時候螢幕將出現如下資訊:
warning:command will be executed using /bin/sh.
job 1 at 1999-12-25 02:00
提醒使用者將使用哪個shell來執行該命令序列。
實際上如果命令序列較長或者經常被執行的時候,一般都採用將該序列寫到一個檔案中,然後將檔案作為at命令的輸入來處理。這樣不容易出錯。
[例5] 上面的例子可以修改如下:
將命令序列寫入到檔案/tmp/printjob,語句為:
$ at -f /tmp/printjob 2:00 12/25/99
這樣一來,at命令將使用檔案中的命令序列,螢幕顯示如下:
Warning:command will be executed using /bin/sh.
job 2 at 1999-12-25 02:00
當然也可以採用以下命令:
$ at find / -name *.txt|lpr
at> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy
現在這個命令就會在合適的時間進行了,進行完後會發回一個資訊。
仍然使用組合鍵來結束命令輸入。而且batch和at命令都將自動轉入後臺,所以啟動的時候也不需要加上&符號。
cron命令
前面介紹的兩條命令都會在一定時間內完成一定任務,但是要注意它們都只能執行一次。也就是說,當指定了執行命令後,系統在指定時間完成任務,一切就結束了。但是在很多時候需要不斷重複一些命令,比如:某公司每週一自動向員工報告頭一週公司的活動情況,這時候就需要使用cron命令來完成任務了。
實際上,cron命令是不應該手工啟動的。cron命令在系統啟動時就由一個shell指令碼自動啟動,進入後臺(所以不需要使用&符號)。一般的使用者沒有執行該命令的許可權,雖然超級使用者可以手工啟動cron,不過還是建議將其放到shell指令碼中由系統自行啟動。
首先cron命令會搜尋/var/spool/cron目錄,尋找以/etc/passwd檔案中的使用者名稱命名的crontab檔案,被找到的這種檔案將載入記憶體。例如一個使用者名稱為foxy的使用者,它所對應的crontab檔案就應該是/var/spool/cron/foxy。也就是說,以該使用者命名的crontab檔案存放在/var/spool/cron目錄下面。cron命令還將搜尋/etc/crontab檔案,這個檔案是用不同的格式寫成的。
cron啟動以後,它將首先檢查是否有使用者設定了crontab檔案,如果沒有就轉入“休眠”狀態,釋放系統資源。所以該後臺程式佔用資源極少。它每分鐘“醒”過來一次,檢視當前是否有需要執行的命令。命令執行結束後,任何輸出都將作為郵件傳送給crontab的所有者,或者是/etc/crontab檔案中MAILTO環境變數中指定的使用者。
上面簡單介紹了一些cron的工作原理,但是cron命令的執行不需要使用者干涉;需要使用者修改的是crontab中要執行的命令序列,所以下面介紹crontab命令。
crontab命令
crontab命令用於安裝、刪除或者列出用於驅動cron後臺程式的表格。也就是說,使用者把需要執行的命令序列放到crontab檔案中以獲得執行。每個使用者都可以有自己的crontab檔案。下面就來看看如何建立一個crontab檔案。
在/var/spool/cron下的crontab檔案不可以直接建立或者直接修改。crontab檔案是透過crontab命令得到的。現在假設有個使用者名稱為foxy,需要建立自己的一個crontab檔案。首先可以使用任何文字編輯器建立一個新檔案,然後向其中寫入需要執行的命令和要定期執行的時間。
然後存檔退出。假設該檔案為/tmp/test.cron。再後就是使用crontab命令來安裝這個檔案,使之成為該使用者的crontab檔案。鍵入:
crontab test.cron
這樣一個crontab 檔案就建立好了。可以轉到/var/spool/cron目錄下面檢視,發現多了一個foxy檔案。這個檔案就是所需的crontab 檔案。用more命令檢視該檔案的內容可以發現檔案頭有三行資訊:
#DO NOT EDIT THIS FILE -edit the master and reinstall.
#(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是:
#切勿編輯此檔案——如果需要改變請編輯原始檔然後重新安裝。
#test.cron檔案安裝時間:14:20:20 02/22/1999
如果需要改變其中的命令內容時,還是需要重新編輯原來的檔案,然後再使用crontab命令安裝。
可以使用crontab命令的使用者是有限制的。如果/etc/cron.allow檔案存在,那麼只有其中列出的使用者才能使用該命令;如果該檔案不存在但cron.deny檔案存在,那麼只有未列在該檔案中的使用者才能使用crontab命令;如果兩個檔案都不存在,那就取決於一些引數的設定,可能是隻允許超級使用者使用該命令,也可能是所有使用者都可以使用該命令。
crontab命令的語法格式如下:
crontab [-u user] file
crontab [-u user]{-l|-r|-e}
第一種格式用於安裝一個新的crontab 檔案,安裝來源就是file所指的檔案,如果使用“-”符號作為檔名,那就意味著使用標準輸入作為安裝來源。
-u 如果使用該選項,也就是指定了是哪個具體使用者的crontab 檔案將被修改。如果不指定該選項,crontab 將預設是操作者本人的crontab ,也就是執行該crontab 命令的使用者的crontab 檔案將被修改。但是請注意,如果使用了su命令再使用crontab 命令很可能就會出現混亂的情況。所以如果是使用了su命令,最好使用-u選項來指定究竟是哪個使用者的crontab檔案。
-l 在標準輸出上顯示當前的crontab。
-r 刪除當前的crontab檔案。
-e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab檔案。當結束編輯離開時,編輯後的檔案將自動安裝。
[例7]
# crontab -l #列出使用者目前的crontab。
10 6 * * * date
0 */2 * * * date
0 23-7/2,8 * * * date
#
在crontab檔案中如何輸入需要執行的命令和時間。該檔案中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
第一項是分鐘,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一週的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果使用者不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字元,所以就可以認為是任何時間,也就是該項被忽略了。在表4-1中給出了每項的合法範圍。
表4-1 指定時間的合法範圍
時間
合法值
minute
00-59
hour
00-23,其中00點就是晚上12點
day-of-month
01-31
month-of-year
01-12
day-of-week
0-6,其中週日是0
這樣使用者就可以往crontab 檔案中寫入無限多的行以完成無限多的命令。命令域中可以寫入所有可以在命令列寫入的命令和符號,其他所有時間域都支援列舉,也就是域中可以寫入很多的時間值,只要滿足這些時間值中的任何一個都執行命令,每兩個時間值中間使用逗號分隔。
[例8]
5,15,25,35,45,55 16,17,18 * * * command
這就是表示任意天任意月,其實就是每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
[例9] 在每週一,三,五的下午3:00系統進入維護狀態,重新啟動系統。那麼在crontab 檔案中就應該寫入如下欄位:
00 15 * * 1,3,5 shutdown -r +5
然後將該檔案存檔為foxy.cron,再鍵入crontab foxy.cron安裝該檔案。
[例10] 每小時的10分,40分執行使用者目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
[例11] 每小時的1分執行使用者目錄下的bin/account這個指令:
1 * * * * bin/account
[例12] 每天早晨三點二十分執行使用者目錄下如下所示的兩個指令(每個指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)
[例13] 每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果新增在mm.txt這個檔案之後(mm.txt檔案位於使用者自己的目錄位置)。
12,55 3 4-9 1,4 * /bin/rm -f expire.1st>>mm.txt
[例14] 我們來看一個超級使用者的crontab檔案:
#Run the ‘atrun' program every minutes
#This runs anything that's due to run from ‘at'.See man ‘at' or ‘atrun'.
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
40 7 * * * updatedb
8,10,22,30,39,46,54,58 * * * * /bin/sync
程式的掛起及恢復命令bg、fg
作業控制允許將程式掛起並可以在需要時恢復程式的執行,被掛起的作業恢復後將從中止處開始繼續執行。只要在鍵盤上按,即可掛起當前的前臺作業。
[例15]
$ cat > text.file
[1] + stopped cat > text.file
$ jobs
[1]+ stopped cat > text.file
在鍵盤上按後,將掛起當前執行的命令cat。使用jobs命令可以顯示shell的作業清單,包括具體的作業、作業號以及作業當前所處的狀態。
恢復程式執行時,有兩種選擇:用fg命令將掛起的作業放回到前臺執行;用bg命令將掛起的作業放到後臺執行。
[例16] 使用者正在使用Emacs,突然需要檢視系統程式情況。就首先使用組合鍵將Emacs程式掛起,然後使用bg命令將其在後臺啟動,這樣就得到了前臺的操作控制權,接著鍵入“ps –x”檢視程式情況。檢視完畢後,使用fg命令將Emacs帶回前臺執行即可。其命令格式為:
$ bg emacs
$ ps –x
$ fg emacs
預設情況下,fg和bg命令對最近停止的作業進行操作。如果希望恢復其他作業的執行,可以在命令中指定要恢復作業的作業號來恢復該作業。例如:
$ fg 1
cat > text.file
靈活使用上述命令,將給自己帶來很大的方便。
本節中要介紹的不只是程式檢視方面的內容,由於Linux是個多使用者系統,有時候也要了解其他使用者現在在幹什麼,所以在本節中還將接觸多使用者方面的內容。同時Linux是一個多程式系統,經常需要對這些程式進行一些調配和管理;而要進行管理,首先就要知道現在的程式情況:究竟有哪些程式?程式情況如何?等等。所以需要程式檢視方面的工作。 who命令 該命令主要用於檢視當前線上上的使用者情況。這個命令非常有用。如果使用者想和其他使用者建立即時通訊,比如使用talk命令,那麼首先要確定的就是該使用者確實線上上,不然talk程式就無法建立起來。又如,系統管理員希望監視每個登入的使用者此時此刻的所作所為,也要使用who命令。 who命令的常用語法格式如下: who [imqsuwHT] [--count] [--idle] [--heading] [--help] [--message] [--mesg] [--version] [--writable] [file] [am i] 所有的選項都是可選的,也就是說可以單獨使用who命令。不使用任何選項時,who命令將顯示以下三項內容: login name:登入使用者名稱; terminal line:使用終端裝置; login time:登入到系統的時間。 如果給出的是兩個非選項引數,那麼who命令將只顯示執行who程式的使用者名稱、登入終端和登入時間。通常這兩個引數是“am i”,即該命令格式為:“who am i”。 下面對who命令的常用引數進行說明。 -m 和“who am i”的作用一樣,顯示執行該程式的使用者名稱。 -q,--count 只顯示使用者的登入帳號和登入使用者的數量,該選項優先順序高於其他任何選項。 -s 忽略。主要是用於和其他版本的who命令相容。 -i,-u,--idle 在登入時間後面顯示該使用者最後一次對系統進行操作至今的時間,也就是常說的“發呆”時間。其中“.”符號代表該使用者在前1秒仍然處於活動狀態;“old”則表示該使用者空閒已經超過了24小時。 -H,--heading 顯示一行列標題。常用的標題如表4-2所示。 表4-2 who命令輸出常用標題 標 題 說 明 USER 使用者登入帳號 LINE 使用者登入使用終端 LOGIN-TIME 使用者登入時間 IDLE 使用者空閒時間,即未進行操作的時間 PID 使用者登入shell的程式ID FROM 使用者網路地址 -w,-T--mesg,--message,--writable 和-s選項一樣,在登入帳號後面顯示一個字元來表示使用者的資訊狀態: +:允許寫資訊; -:不允許寫資訊; ?:不能找到終端裝置。 --help 在標準輸出上顯示幫助資訊。 --version 在標準輸出上顯示版本資訊。 下面介紹who命令的一些基本用法。 如果需要檢視在系統上究竟有哪些使用者,可以直接使用who命令。 [例17] 檢視登入到系統的使用者情況 $ who root tty1 Mar 17 13:49 foxy tty2 Mar 17 13:49 root tty3 Mar 17 13:49 bbs ttyp0 Mar 17 13:49 (river.net) 可以看到,現在系統一共有四個使用者。第一列是登入使用者的帳號;第二列是登入所使用的終端;第三列是登入時間;第四列是使用者從什麼地方登入的網路地址,這裡是域名。 一般來說,這樣就可以瞭解登入使用者的大致情況了。但有時上面的顯示不是那麼直觀,因為沒有標題說明,不容易看懂,這時就需要使用-H選項了。 [例18] 檢視登入使用者的詳細情況,鍵入: $ who -uH 顯示如下: USER LINE LOGIN-TIME IDLE FROM root tty1 Mar 17 13:49 . foxy tty2 Mar 17 13:49 00:01 root tty3 Mar 17 13:49 00:01 bbs ttyp0 Mar 17 13:49 00:01 (river.net) 這樣一目瞭然。其中-u選項指定顯示使用者空閒時間,所以可以看到多了一項IDLE。第一個root使用者的IDLE項是一個“.”,這就說明該使用者在前1秒仍然是活動的,而其他使用者後面都有一個時間,稱為空閒時間。 最後來看看使用“who am i”格式命令的結果: 233.river.net!root tty1 Mar 17 13:49 可見只顯示出了執行該who命令的使用者情況,當然這時候不存在空閒時間。 who命令應用起來非常簡單,可以比較準確地掌握使用者的情況,所以使用非常廣泛。 w命令 該命令也用於顯示登入到系統的使用者情況,但是與who不同的是,w命令功能更加強大,它不但可以顯示有誰登入到系統,還可以顯示出這些使用者當前正在進行的工作,並且統計資料相對who命令來說更加詳細和科學,可以認為w命令就是who命令的一個增強版。 w命令的顯示專案按以下順序排列:當前時間,系統啟動到現在的時間,登入使用者的數目,系統在最近1秒、5秒和15秒的平均負載。然後是每個使用者的各項資料,專案顯示順序如下:登入帳號、終端名稱、遠端主機名、登入時間、空閒時間、JCPU、PCPU、當前正在執行程式的命令列。 其中JCPU時間指的是和該終端(tty)連線的所有程式佔用的時間。這個時間裡並不包括過去的後臺作業時間,但卻包括當前正在執行的後臺作業所佔用的時間。而PCPU時間則是指當前程式(即在WHAT項中顯示的程式)所佔用的時間。下面介紹該命令的具體用法和引數。 語法格式如下: w -[husfV] [user] 下面對引數進行說明: -h 不顯示標題。 -u 當列出當前程式和CPU時間時忽略使用者名稱。這主要是用於執行su命令後的情況。 -s 使用短模式。不顯示登入時間、JCPU和PCPU時間。 -f 切換顯示FROM項,也就是遠端主機名項。預設值是不顯示遠端主機名,當然系統管理員可以對原始檔作一些修改使得顯示該項成為預設值。 -V 顯示版本資訊。 User 只顯示指定使用者的相關情況。 [例19] 顯示當前登入到系統的使用者的詳細情況 $ w 2:50pm up 2 min, 4 users, load average:0.22,0.16,0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 2:49pm 0:00s 0.56s 0.10s w foxy tty2 2:49pm 1:09 0.42s 0.42s bash root tty3 2:49pm 46.00s 0.67s 0.25s telnet bbs3 bbs ttyp0 river.net 2:49pm 45.00s 0.49s 0.49s bbs h river.net ps命令 1. ps簡介 前面介紹的兩個命令都是用於檢視當前系統使用者的情況,下面就來看看程式的情況,這也是本章的主題。要對程式進行監測和控制,首先必須要了解當前程式的情況,也就是需要檢視當前程式,而ps命令就是最基本同時也是非常強大的程式檢視命令。使用該命令可以確定有哪些程式正在執行和執行的狀態、程式是否結束、程式有沒有僵死、哪些程式佔用了過多的資源等等。總之大部分資訊都是可以透過執行該命令得到的。 2. ps命令及其引數 ps命令最常用的還是用於監控後臺程式的工作情況,因為後臺程式是不和螢幕鍵盤這些標準輸入/輸出裝置進行通訊的,所以如果需要檢測其情況,便可以使用ps命令了。 該命令語法格式如下: ps [選項] 下面對命令選項進行說明: -e 顯示所有程式。 -f 全格式。 -h 不顯示標題。 -l 長格式。 -w 寬輸出。 a 顯示終端上的所有程式,包括其他使用者的程式。 r 只顯示正在執行的程式。 x 顯示沒有控制終端的程式。 O[+|-] k1 [,[+|-] k2 [,…]] 根據SHORT KEYS、k1、k2中快捷鍵指定的多級排序順序顯示程式列表。對於ps的不同格式都存在著預設的順序指定。這些預設順序可以被使用者的指定所覆蓋。其中“+”字元是可選的,“-”字元是倒轉指定鍵的方向。 pids 只列出指定程式的情況。各程式ID之間使用逗號分隔。該程式列表必須在命令列引數的最後一個選項後面緊接著給出,中間不能插入空格。比如:ps -f1,4,5。 以下介紹長命令列選項,這些選項都使用“--”開頭: --sort X[+|-] key [,[+|-] key [,…]] 從SORT KEYS段中選一個多字母鍵。“+”字元是可選的,因為預設的方向就是按數字升序或者詞典順序。比如: ps -jax -sort=uid,-ppid,+pid。 --help 顯示幫助資訊。 --version 顯示該命令的版本資訊。 在前面的選項說明中提到了排序鍵,接下來對排序鍵作進一步說明。需要注意的是排序中使用的值是ps使用的內部值,並非僅用於某些輸出格式的偽值。排序鍵列表見表4-3。 表4-3 排序鍵列表 短格式 長格式 說 明 c cmd 可執行的簡單名稱 C cmdline 完整命令列 f flags 長模式標誌 g pgrp 程式的組ID G tpgid 控制tty程式組ID j cutime 累計使用者時間 J cstime 累計系統時間 k utime 使用者時間 K stime 系統時間 m min_flt 次要頁錯誤的數量 M maj_flt 主要頁錯誤的數量 n cmin_flt 累計次要頁錯誤 N cmaj_flt 累計主要頁錯誤 o session 對話ID p pid 程式ID P ppid 父程式ID r rss 駐留大小 R resident 駐留頁 s size 記憶體大小(千位元組) S share 共享頁的數量 t tty tty次要裝置號 T start_time 程式啟動的時間 U uid UID u user 使用者名稱 v vsize 總的虛擬記憶體數量(位元組) y priority 核心排程優先順序 3. 常用ps命令引數 前面兩節介紹的引數可能讓讀者覺得有些可怕,實際上這是一個非常容易使用的命令,一般的使用者只需掌握一些最常用的命令引數就可以了。 最常用的三個引數是u、a、x,下面將透過例子來說明其具體用法。 [例20] 以root身份登入系統,檢視當前程式狀況 $ ps PID TTY TIME COMMAND 5800 ttyp0 00:00:00 bash 5835 ttyp0 00:00:00 ps 可以看到,顯示的專案共分為四項,依次為PID(程式ID)、TTY(終端名稱)、TIME(程式執行時間)、COMMAND(該程式的命令列輸入)。 可以使用u選項來檢視程式所有者及其他一些詳細資訊,如下所示: $ ps u USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u 在bash程式前面有條橫線,意味著該程式便是使用者的登入shell,所以對於一個登入使用者來說帶短橫線的程式只有一個。還可以看到%CPU、%MEM兩個選項,前者指該程式佔用的CPU時間和總時間的百分比;後者指該程式佔用的記憶體和總記憶體的百分比。 在這種情況下看到了所有控制終端的程式;但是對於其他那些沒有控制終端的程式還是沒有觀察到,所以這時就需要使用x選項。使用x選項可以觀察到所有的程式情況。 [例21] 下面是使用x選項的例子: $ ps x PID TTY STAT TIME COMMAND 5800 ttyp0 S 0:00 -bash 5813 ttyp1 S 0:00 -bash 5921 ttyp0 S 0:00 man ps 5922 ttyp0 S 0:00 sh -c /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz | / 5923 ttyp0 S 0:00 /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz 5924 ttyp0 S 0:00 /usr/bin/less -is 5941 ttyp1 R 0:00 ps x 可以發現突然一下子就多出了那麼多的程式。這些多出來的程式就是沒有控制終端的程式。 前面看到的所有程式都是test使用者自己的。其實還有許多其他使用者在使用著系統,自然也就對應著其他的很多程式。如果想對這些程式有所瞭解,可以使用a選項來檢視當前系統所有使用者的所有程式。經常使用的是aux組合選項,這可以顯示最詳細的程式情況。 [例22] $ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1136 64 ? S Nov25 0:02 init [3] root 2 0.0 0.0 0 0 ? SW Nov25 0:00 [kflushd] root 3 0.0 0.0 0 0 ? SW Nov25 0:03 [kupdate] root 4 0.0 0.0 0 0 ? SW Nov25 0:00 [kpiod] root 5 0.0 0.0 0 0 ? SW Nov25 0:00 [kswapd] root 163 0.0 0.1 1628 332 ? S Nov25 0:02 sshd root 173 0.0 0.0 1324 200 ? S Nov25 0:00 syslogd root 181 0.0 0.0 1420 0 ? SW Nov25 0:00 [klogd] daemon 191 0.0 0.1 1160 312 ? S Nov25 0:00 /usr/sbin/atd root 201 0.0 0.1 1348 492 ? S Nov25 0:00 crond root 212 0.0 0.0 1292 68 ? S Nov25 0:00 inetd …… 在顯示的最前面是其他使用者的程式情況,可以看到有root、daemon等使用者以及他們所啟動的程式。 在上面的例子中,介紹了ps命令最常見的一些選項和選項組合,使用者可以根據自己的需要選用。 top命令 top命令和ps命令的基本作用是相同的,顯示系統當前的程式和其他狀況;但是top是一個動態顯示過程,即可以透過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它將獨佔前臺,直到使用者終止該程式為止。 比較準確的說,top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最“敏感”的任務列表。該命令可以按CPU使用。記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以透過互動式命令或者在個人定製檔案中進行設定。在後面的介紹中將把命令引數和互動命令分開講述。 下面是該命令的語法格式: top [-] [d delay] [q] [c] [s] [S] [i] d 指定每兩次螢幕資訊重新整理之間的時間間隔。當然使用者可以使用s互動命令來改變之。 q 該選項將使top沒有任何延遲的進行重新整理。如果呼叫程式有超級使用者許可權,那麼top將以儘可能高的優先順序執行。 S 指定累計模式。 s 使top命令在安全模式中執行。這將去除互動命令所帶來的潛在危險。 i 使top不顯示任何閒置或者僵死程式。 c 顯示整個命令列而不只是顯示命令名 top命令顯示的專案很多,預設值是每5秒更新一次,當然這是可以設定的。顯示的各專案為: uptime 該項顯示的是系統啟動時間、已經執行的時間和三個平均負載值(最近1秒,5秒,15秒的負載值)。 processes 自最近一次重新整理以來的執行程式總數。當然這些程式被分為正在執行的,休眠的,停止的等很多種類。程式和狀態顯示可以透過互動命令t來實現。 CPU states 顯示使用者模式,系統模式,優先順序程式(只有優先順序為負的列入考慮)和閒置等各種情況所佔用CPU時間的百分比。優先順序程式所消耗的時間也被列入到使用者和系統的時間中,所以總的百分比將大於100%。 Mem 記憶體使用情況統計,其中包括總的可用記憶體,空閒記憶體,已用記憶體,共享記憶體和快取所佔記憶體的情況。 Swap 交換空間統計,其中包括總的交換空間,可用交換空間,已用交換空間。 PID 每個程式的ID。 PPID 每個程式的父程式ID。 UID 每個程式所有者的UID 。 USER 每個程式所有者的使用者名稱。 PRI 每個程式的優先順序別。 NI 該程式的優先順序值。 SIZE 該程式的程式碼大小加上資料大小再加上堆疊空間大小的總數。單位是KB。 TSIZE 該程式的程式碼大小。對於核心程式這是一個很奇怪的值。 DSIZE 資料和堆疊的大小。 TRS 文字駐留大小。 D 被標記為“不乾淨”的頁專案。 LIB 使用的庫頁的大小。對於ELF程式沒有作用。 RSS 該程式佔用的實體記憶體的總數量,單位是KB。 SHARE 該程式使用共享記憶體的數量。 STAT 該程式的狀態。其中S代表休眠狀態;D代表不可中斷的休眠狀態;R代表執行狀態;Z代表僵死狀態;T代表停止或跟蹤狀態。 TIME 該程式自啟動以來所佔用的總CPU時間。如果進入的是累計模式,那麼該時間還包括這個程式子程式所佔用的時間。且標題會變成CTIME。 %CPU 該程式自最近一次重新整理以來所佔用的CPU時間和總時間的百分比。 %MEM 該程式佔用的實體記憶體佔總記憶體的百分比。 COMMAND 該程式的命令名稱,如果一行顯示不下,則會進行擷取。記憶體中的程式會有一個完整的命令列。 下面介紹在top命令執行過程中可以使用的一些互動命令。從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令列選項中使用了s選項,則可能其中一些命令會被遮蔽掉。 立即重新整理顯示。 Ctrl+L 擦除並且重寫螢幕。 h或者? 顯示幫助畫面,給出一些簡短的命令總結說明。 k 終止一個程式。系統將提示使用者輸入需要終止的程式PID,以及需要傳送給該程式什麼樣的訊號。一般的終止程式可以使用15訊號;如果不能正常結束那就使用訊號9強制結束該程式。預設值是訊號15。在安全模式中此命令被遮蔽。 i 忽略閒置和僵死程式。這是一個開關式命令。 q 退出程式。 r 重新安排一個程式的優先順序別。系統提示使用者輸入需要改變的程式PID以及需要設定的程式優先順序值。輸入一個正值將使優先順序降低,反之則可以使該程式擁有更高的優先權。預設值是10。 S 切換到累計模式。 s 改變兩次重新整理之間的延遲時間。系統將提示使用者輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s。需要注意的是如果設定太小的時間,很可能會引起不斷重新整理,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。 f或者F 從當前顯示中新增或者刪除專案。 o或者O 改變顯示專案的順序。 l 切換顯示平均負載和啟動時間資訊。 m 切換顯示記憶體資訊。 t 切換顯示程式和CPU狀態資訊。 c 切換顯示命令名稱和完整命令列。 M 根據駐留記憶體大小進行排序。 P 根據CPU使用百分比大小進行排序。 T 根據時間/累計時間進行排序。 W 將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法。 從上面的介紹中可以看到,top命令是一個功能十分強大的監控系統的工具,尤其對於系統管理員而言更是如此。一般的使用者可能會覺得ps命令其實就夠用了,但是top命令的強勁功能確實提供了不少方便。下面來看看實際使用的情況。 [例23] 鍵入top命令檢視系統狀況 $ top 1:55pm up 7 min, 4 user, load average:0.07,0.09,0.06 29 processes:28 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 4.5% user, 3.6% system, 0.0% nice, 91.9% idle Mem: 38916K av, 18564K used, 20352K free, 11660K shrd, 1220K buff Swap: 33228K av, 0K used, 33228K free, 11820K cached PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND 363 root 14 0 708 708 552 R 0 8.1 1.8 0:00 top 1 root 0 0 404 404 344 S 0 0.0 1.0 0:03 init 2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd 3 root -12 -12 0 0 0 SW
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-944452/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LINUX(十一)Linux程式管理及作業控制Linux
- Linux程式及作業管理Linux
- 【Linux】Linux作業系統 程式管理Linux作業系統
- 【作業系統】 第二章 程式管理 程式的描述與控制作業系統
- 作業系統-程式管理作業系統
- Linux作業系統的高階電源管理(轉)Linux作業系統
- RedHat Linux作業系統軟體包的管理(轉)RedhatLinux作業系統
- LINUX程式如何管理控制(二)Linux
- 作業基礎管理(轉載)
- 作業系統實驗——程式控制作業系統
- Linux作業系統程式管理的分析與應用Linux作業系統
- 理解linux/unix作業系統守護程式(轉)Linux作業系統
- Linux作業系統檔案管理器的共享(轉)Linux作業系統
- 【Linux】類Unix 作業系統程式監控控制工具 SupervisorLinux作業系統
- Linux 程式管理(轉)Linux
- 作業系統篇-程式管理作業系統
- 【作業系統】程式管理(二)作業系統
- 讓Linux懂得為你開門—LINUX系統的自動作業控制(轉)Linux
- 使用BCB製作控制面版程式 (轉)
- 探索Linux 作業系統記憶體模型和管理-1(轉)Linux作業系統記憶體模型
- 探索Linux 作業系統記憶體模型和管理8(轉)Linux作業系統記憶體模型
- Linux安裝及管理程式Linux
- 程式設計作業——系統管理程式設計
- 作業系統3——程式的描述與控制作業系統
- 淺談linux作業系統的最佳化及安全配置(轉)Linux作業系統
- Linux作業系統的許可權程式碼分析【轉】Linux作業系統
- Linux作業系統記憶體管理的原始碼實現(轉)Linux作業系統記憶體原始碼
- Linux作業系統介紹(轉)Linux作業系統
- 作業系統-5-程式管理(二)作業系統
- 作業系統之程式管理:16、管程作業系統
- Linux作業系統下乙太網卡的安裝及配置(轉)Linux作業系統
- LINUX系統中程式如何管理控制(一)Linux
- 作業系統(二)——程式的描述與控制(1)作業系統
- 作業系統概念-程式控制 實驗報告作業系統
- 深入理解Linux作業系統下的守護程式(轉)Linux作業系統
- Linux 作業系統程式設計之Shell 問答錄(轉)Linux作業系統程式設計
- 在Linux作業系統上執行Windows應用程式(轉)Linux作業系統Windows
- Linux作業系統邏輯盤卷管理LVM建立步驟(轉)Linux作業系統LVM