歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Linux 進程管理

Linux 進程管理

日期:2017/2/27 9:37:48   编辑:更多Linux

摘要:Linux是一個多用戶多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計算機系統;多任務是指Linux可以同時執行幾個任務,它可以在還未執行完一個任務時又執行另一項任務。操作系統管理多個用戶的請求和多個任務。大多數系統都只有一個CPU和一個主存,但一個系統可能有多個二級存儲磁盤和多個輸入/輸出設備。  Linux是一個多用戶多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計算機系統;多任務是指Linux可以同時執行幾個任務,它可以在還未執行完一個任務時又執行另一項任務。操作系統管理多個用戶的請求和多個任務。大多數系統都只有一個CPU和一個主存,但一個系統可能有多個二級存儲磁盤和多個輸入/輸出設備。操作系統管理這些資源並在多個用戶間共享資源,當您提出一個請求時,給您造成一種假象,好象系統只被您獨自占用。而實際上操作系統監控著一個等待執行的任務隊列,這些任務包括用戶作業、操作系統任務、郵件和打印作業等。操作系統根據每個任務的優先級為每個任務分配合適的時間片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經足夠計算機完成成千上萬的指令集。每個任務都會被系統運行一段時間,然後掛起,系統轉而處理其他任務;過一段時間以後再回來處理這個任務,直到某個任務完成,從任務隊列中去除。      一、進程及作業      Linux系統上所有運行的東西都可以稱之為一個進程。每個用戶任務、每個系統管理守護進程,都可以稱之為進程。Linux用分時管理方法使所有的任務共同分享系統資源。我們所關心的是如何去控制這些進程,讓它們能夠很好地為用戶服務。進程的一個比較正式的定義是∶在自身的虛擬地址空間運行的一個單獨的程序。      進程與程序是有區別的,進程不是程序,雖然它由程序產生。程序只是一個靜態的指令集合,不占系統的運行資源;而進程是一個隨時都可能發生變化的、動態的、使用系統運行資源的程序。而且一個程序 可以啟動多個進程。      進程和作業的概念也有區別。一個正在執行的進程稱為一個作業,而且作業可以包含一個或多個進程,尤其是當使用了管道和重定向命令。      作業控制指的是控制正在運行的進程的行為。比如,用戶可以掛起一個進程,等一會兒再繼續執行該進程。shell將記錄所有啟動的進程情況,在每個進程過程中,用戶可以任意地掛起進程或重新啟動進程。作業控制是許多shell(包括bash和tcsh)的一個特性,使用戶能在多個獨立 作業間進行切換。      例如,當用戶編輯一個文本文件,並需要中止編輯做其他事情時,利用作業控制,用戶可以讓編輯器暫時掛起,返回shell提示符開始做其他的事情。其他事情做完以後,用戶可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象用戶從來沒有離開編輯器一樣。      這只是一個例子,作業控制還有許多其他實際的用途。      二、啟動進程      鍵入需要運行的程序的程序名,執行一個程序,其實也就是啟動了一個進程。在Linux系統中每個進程都具有一個進程號,用於系統識別和調度進程。啟動一個進程有兩個主要途徑∶手工啟動和調度啟動,後者是事先進行設置,根據用戶要求自行啟動。       1、手工啟動      由用戶輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為前台啟動和後台啟動。       前台啟動是手工啟動一個進程的最常用的方式。一般地,用戶鍵入一個命令“ls-l”,這就已經啟動了一個進程,而且是一個前台的進程。這時候系統其實已經處於一個多進程狀態。      或許有些用戶會疑惑∶我只啟動了一個進程而已。但實際上有許多運行在後台的、系統啟動時就已經自動啟動的進程正在悄悄運行著。還有的用戶在鍵入“ls -l”命令以後趕緊使用 “ps -x”查看,卻沒有看到ls進程,也覺得很奇怪。其實這是因為ls這個進程結束太快,使用ps查看時該進程已經執行結束了。      直接從後台手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結果的時候。假設用戶要啟動一個需要長時間運行的格式化文本文件的進程。為了不使整個shell在格式化過程中都處於“癱瘓”狀態,從後台啟動這個進程是明智的選擇。      2、調度啟動      有時候需要對系統進行一些比較費時而且占用資源的維護工作,這些工作適合在深夜進行,這時候用戶就可以事先進行調度安排,指定任務運行的時間或者場合,到時候系統會自動完成這一切工作。要使用自動啟動進程的功能,就需要掌握以下幾個啟動命令。      第一個重要的命令是at命令用戶使用at命令在指定時刻執行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執行時間才可以正常運行。at命令可以只指定時間,也可以時間和日期一起指定。需要注意的是,指定時間有個系統判別問題。比如說∶用戶現在指定了一個執行時間∶凌晨3:20,而發出at命令的時間是頭天晚上的20:00,那麼究竟是在哪一天執行該命令呢?如果用戶在3:20以前仍然在工作,那麼該命令將在這個時候完成;如果用戶3:20以前就退出了工作狀態,那麼該命令將在第二天凌晨才得到執行。下面是at命令的語法格式∶      at [-V] [-q 隊列] [-f 文件名] [-mldbv] 時間      at -c 作業 [作業...]      at允許使用一套相當復雜的指定時間的方法,它可以接受在當天的 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(明天)來指定完成命令的時間。下面通過一些例子來說明具體用法。      [例] 指定在今天下午 5:30 執行某命令。假設現在時間是中午12:30,2001年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的所有者。在7月31日上午10點執行文件work中的作業。       在任何情況下,超級用戶都可以使用這個命令。對於其他用戶來說,是否可以使用就取決於兩個文件∶ /etc/at.allow 和 /etc/at.deny 。       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文件。      在crontab文件中如何輸入需要執行的命令和時間。該文件中每行都包括六個 域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者制表符分隔。      格式如下∶    minute hour day-of-month month-of-year day-of-week commands      第一項是分鐘,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一周的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果用戶不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字符,所以就可以認為是任何時間,也就是該項被忽略了。      進程的掛起及恢復命令bg、fg      作業控制允許將進程掛起並可以在需要時恢復進程的運行,被掛起的作業恢復 後將從中止處開始繼續運行。只要在鍵盤上按ctrl+z,即可掛起當前的前台作業。 在鍵盤上按ctrl+z後,將掛起當前執行的命令cat。使用jobs命令可以顯示 shell的作業清單,包括具體的作業、作業號以及作業當前所處的狀態。恢復進程執行時,有兩種選擇∶用fg命令將掛起的作業放回到前台執行;用bg命令將掛起的作業放到後台執行。 靈活使用上述命令,將給自己帶來很大的方便。      進程查看      由於Linux是個多用戶系統,有時候也要了解其他用戶現在在干什麼,同時 Linux是一個多進程系統,經常需要對這些進程進行一些調配和管理;而要進行管理,首先就要知道現在的進程情況∶究竟有哪些進程?進程情況如何?等等。所以需要進程查看方面的工作。       who命令       該命令主要用於查看當前在線上的用戶情況。這個命令非常有用。如果用戶想 和其他用戶建立即時通訊,比如使用talk命令,那麼首先要確定的就是該用戶確實在線上,不然talk進程就無法建立起來。又如,系統管理員希望監視每個登錄的用戶此時此刻的所作所為,也要使用who命令。      who命令應用起來非常簡單,可以比較准確地掌握用戶的情況,所以使用非常廣泛。       w命令      該命令也用於顯示登錄到系統的用戶情況,但是與who不同的是,w命令功能更 加強大,它不但可以顯示有誰登錄到系統,還可以顯示出這些用戶當前正在進行的工作,並且統計數據相對who命令來說更加詳細和科學,可以認為w命令就是who命令的一個增強版。w命令的顯示項目按以下順序排列∶當前時間,系統啟動到現在的時間,登錄用戶的數目,系統在最近1秒、5秒和15秒的平均負載。然後是每個用戶的各項數據,項目顯示順序如下∶登錄帳號、終端名稱、遠程主機名、登錄時間、空閒時間、JCPU、PCPU、當前正在運行進程的命令行。其中JCPU時間指的是和該終端(tty)連接的所有進程占用的時間。這個時間裡並不包括過去的後台作業時間,但卻包括當前正在運行的後台作業所占用的時間。而PCPU時間則是指當前進程(即在WHAT項中顯示的進程)所占用的時間。      ps命令       ps命令就是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵屍、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。      ps命令最常用的還是用於監控後台進程的工作情況,因為後台進程是不和屏幕鍵盤這些標准輸入/輸出設備進行通信的,所以如果需要檢測其情況,便可以使用ps命令了。      ps [選項]      下面對命令選項進行說明∶      -e 顯示所有進程。       -f 全格式。       -h 不顯示標題。       -l 長格式。       -w 寬輸出。       a 顯示終端上的所有進程,包括其他用戶的進程。       r 只顯示正在運行的進程。       x 顯示沒有控制終端的進程。       O[+-] k1 [,[+-] k2 [,…]] 根據SHORT KEYS、k1、k2中快捷鍵指定的多 級排序順序顯示進程列表。對於ps的不同格式都存在著默認的順序指定。這些默 認順序可以被用戶的指定所覆蓋。其中“+”字符是可選的,“-”字符是倒轉指 定鍵的方向。       最常用的三個參數是u、a、x.      top命令      top命令和ps命令的基本作用是相同的,顯示系統當前的進程和其他狀況;但是top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態。如果在前台執行該命令,它將獨占前台,直到用戶終止該程序為止。比較准確的說,top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最“敏感”的任務列表。該命令可以按CPU使用。內存使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過交互式命令或者在個人定制文件中進行設定。       三、進程調度      當需要中斷一個前台進程的時候,通常是使用Ctrl+c組合鍵;但是對於一個 後台進程恐怕就不是一個組合鍵所能解決的了,這時就必須求助於kill命令。該命令可以終止後台進程。至於終止後台進程的原因很多,或許是該進程占用的CPU時間過多;或許是該進程已經掛死。總之這種情況是經常發生的。      kill命令是通過向進程發送指定的信號來結束進程的。如果沒有指定發送信號,那麼默認值為TERM信號。TERM信號將終止所有不能捕獲該信號的進程。至於那些可以捕獲該信號的進程可能就需要使用kill(9)信號了,該信號是不能被捕捉的。      kill命令的語法格式很簡單,大致有以下兩種方式∶      kill [-s 信號 -p ] [ -a ] 進程號 ...      kill -l [信號]    






Copyright © Linux教程網 All Rights Reserved