Linux中的工做管理(Job Control )

之前使用Linux總是會不當心按下Ctrl + z,而後就出現看不懂的狀況,覺得程序忽然就沒了,今天專門研究了下Linux下的幾個快捷鍵和工做管理。html

其中找到一篇很不錯的文章,大部分是裏面轉載的。linux

原文地址:http://blog.chinaunix.net/uid-26495963-id-3062757.htmlshell

一.Job的概念

    Job是指在批處理的環境中,爲完成某一任務而進行一系列操做的總稱。在我的接觸計算機的年代,批處理的環境已經不容見到了,只有一些特殊的行業和環境下還在使用這樣的概念,僅在書本中接觸過。
在Linux下,能夠簡單的把Job理解爲,一個或多個經過Pipe連接的命令及其運行所完成的任務。
例如,我須要把當前的登陸的用戶信息,記錄到名字爲LoginUser的文件中,那麼我可能回執行下面命令來完成:
lennon@lennon-laptop:~$ who > LoginUser
那們就能夠把從命令的執行到LoginUser文件輸出的整個過程成爲一個Job。ui

 

二.Linux下Ctrl-Z、Ctrl-C、Ctrl-D的具體含義

      初識Linux,可能會對Ctrl-Z、Ctrl-C、Ctrl-D的具體含義混淆不清,由於這三個按鍵都可以在一些狀況下使shell退出正在執行的命令或程序,提示用戶輸入下一個命令,從而對初識者形成假象,認爲三個鍵的功能同樣,但具體狀況下哪一個按鍵能起做用、起什麼做用卻拿捏不定。

    Ctrl-Z:該鍵是linux下面默認的掛起鍵(Suspend Key),當鍵入Ctrl-Z時,系統會將正在運行的程序掛起(注意是掛起,或者暫停),而後放到後臺,同時給出用戶相關的job信息。此時,程序並無真正的中止,用戶能夠經過使用fg、bg命令將job恢復到暫停前的上下文環境,並繼續執行。
    Ctrl-C:該鍵是linux下面默認的中斷鍵(Interrupt Key),當鍵入Ctrl-C時,系統會發送一箇中斷信號給正在運行的程序和shell。具體的響應結果會根據程序的不一樣而不一樣。一些程序在收到這個信號後,會當即結束並推出程序,一些程序可能會忽略這個中斷信號,還有一些程序在接受到這個信號後,會採起一些其餘的動做(Action)。當shell接受到這個中斷信號的時候,它會返回到提示界面,並等待下一個命令。
    Ctrl-D:該鍵是Linux下面標準輸入輸出的EOF。在使用標準輸入輸出的設備中,遇到該符號,會認爲讀到了文件的末尾,所以結束輸入或輸出。編碼

 

二.Linux下面Job Control的一些知識(包括jobs、bg、fg、kill命令的使用)

1.經過使用‘&’操做符讓Job在後臺運行

   特別注意:咱們在這裏提到的「後臺」是指在終端機模式下能夠避免Ctrl + c中斷的一個情景,並非放到系統的後臺去。因此,工做管理的後臺依舊和終端機有關,當你使用&放到後臺時,中斷結束了,那麼工做也會被中斷掉。 若是須要了解更多請查找nohup或者screen命令。spa

   一般咱們Linux的終端中,運行某一命令時,終端老是等待某一特定的命令或程序運行完之後,給出一個提示,而後咱們才能繼續運行下一個命令。若是咱們要運行一個比較耗時的命令,可是在該命令運行的同時還須要作另外的一些事,那該怎麼辦呢?
   你能夠經過在命令的後面加上一個‘&’操做符,來讓一個任務在後臺運行(注意這裏是在後臺運行)。(固然若是你是用GUI界面,你也能夠從新打開一個窗口運行新的命令或程序)
例如,咱們須要拷貝一個比較大的文件,在拷貝的同時,還要作其餘一些事情,那麼在拷貝命令後面加上一個‘&’,讓它在後臺拷貝:
lennon@lennon-laptop:~$ cp /media/bigfile /home/lennon/Downloads/ &
[1] 3526
lennon@lennon-laptop:~$ 
此時,咱們能夠看到在終端中,執行了某一命令後,給出了一些信息,而後就返回了,接着提示用戶能夠出入下一個命令了,這樣程序或命令就在後臺執行了。
在顯示的信息中,用方括號括起來的數字,表示系統分配給這個Job的Job Number,這裏'[1]'中的1,就是這個Job的Job Number。然後面一個比較大的數字,則是系統分配的進程ID(PID),這個PID在系統就表明這個進程。
在後臺運行的job,當其運行完成之後,且輸入回車後,會在終端中給出一個提示:
lennon@lennon-laptop:~$ rm Downloads/linux_11gR2_database_1of2.zip &
[1] 3666
lennon@lennon-laptop:~$ 
[1]+  Done                    rm Downloads/linux_11gR2_database_1of2.zip
.net

 

2.使用jobs命令,來查看當前系統中的Job

若是咱們須要查看當前系統中,有那些job,使用‘jobs’命令:
lennon@lennon-laptop:~$ jobs
[1]-  Running                 cp /media/bigfile /home/lennon/Downloads/ &
[2]+  Stopped                 cat
lennon@lennon-laptop:~$ 
如此時,顯示個人系統中有2個job,一個是剛纔的正在運行的拷貝命令([1]標識),一個是中止運行的cat命令([2]表示)。這裏‘Running’、‘Stopped’表示任務的狀態

jobs命令參考
命令名稱:jobs
使用權限:全部權限
命令描述:列出系統中的job。注意:不是全部的shell都能使用此命令
語法:jobs [-p | -l] [-n] [-p] [-x] [job id]
參數:
-p | -l : Report the process group ID and working directory of the jobs.
-n      : Display only jobs that have stopped or exited since last notified.
-p      : Displays only the process IDs for the process group leaders of the selected jobs.
-x      : Replace any job_id found in command or arguments with the corresponding 
           process group ID, and then execute command passing it arguments.
job id  : The job id.unix

 

3.Suspend key 和 bg命令的使用(將一個正在運行的job放到後臺運行)

      若是你在運行job前,並不知道該job的運行狀況,但在job運行了之後,發現這個是耗時的任務,並想將其放入到後臺運行,這樣你能夠在這個任務運行的同時,完成一些其餘的事情,那麼你能夠這樣作:
使用掛起鍵(Suspend Key,一般是Ctrl-Z)將該任務掛起(也就是暫停),而後使用‘bg’命令在後臺讓該job恢復執行。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ bg %1
[1]+ cp bigfile bigfile.bac &
lennon@lennon-laptop:~$
使用Ctrl-Z後,系統會將當前正在運行的job暫停,將其移至後臺,給出用戶改任務的提示(包括job number、狀態、job),而後提示用戶輸入下一個命令。
在job掛起後,可使用‘bg’命令,讓job恢復到剛纔中斷的地方繼續運行並將其放到後臺運行。使用‘bg %job number’來指定你須要對哪個job進行操做,這裏‘%’告訴系統後面的數字是一個job number(不要‘%’可能也能夠)。固然在系統中只有一個job的時候,你也能夠忽略改參數。

bg命令參考:
命令名稱:bg
使用權限:全部權限
命令描述:在後臺恢復已中止的job繼續運行。注意該命令不能在全部的Unix的shell下運行
語法:bg [-l] [-p] [-x] [job]
參數:
-l    : Report the process group ID and working directory of the jobs.
-p    : Report only the process group ID of the jobs.
-x    : Replace any job_id found in command or arguments with the corresponding process  
         group ID, and then execute command passing it arguments.
job   : Specifies the job that you want to run in the backgroundcode

 

4.使用fg命令,將在後臺的job換到前臺

當你須要將在後臺的job換到前臺時,使用‘fg %job number’命令(也許不要‘%’也能夠)。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac &
[1] 3815
lennon@lennon-laptop:~$ fg 1
cp bigfile bigfile.bac

fg命令參考:
命令名稱:fg
使用權限:全部權限
命令描述:將後臺的任務移至前臺,若是是該任務處於暫停狀態,則恢復該任務的運行。
         注意該命令不是在全部的shell中都能運行。
語法:fg [%job]
參數:
%job : Specifies the job that you want to run in the foreground.htm



5.如何結束一個job

若是你想結束一個正在運行的job,可使用中斷鍵(interrupt key,一般是Ctrl-C)來結束。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^C
lennon@lennon-laptop:~$ 
若是上面方法沒法正常工做,那麼你能夠考慮使用Ctrl-Z(Suspend key)來暫停job,使用'jobs'命令來查看這個job的job number,而後經過'kill'命令來結束這個job.
lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ jobs
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ kill %1
lennon@lennon-laptop:~$ 
[1]+  Terminated              cp bigfile bigfile.bac

kill格式爲kill -signal %jobnumber

注意:這裏的kill也能夠結束進程,區別在於若是不加%直接接一個數字,那麼毀直接kill掉PID爲該數字的進程

signal表明一個信號,一般進程之間能夠互相控制的,好比你能夠關閉,或者從新啓動軟件。那麼程序是如何互相管理的呢?

其實就是經過給予該進程一個信號(signal)去告知進程你想讓它作什麼。

'kill %1'中的'%'告訴系統,後面的數字是一個job number。默認狀況下,kill將會向程序發送一個termination signal(-TERM)。若是這個信號不起做用,考慮使用'kill -kill %job number'來發送一個kill signal(-KILL)。
'kill'命令的使用,就看man把,info也能夠,這裏不說了,上面東西太多。不過經常使用的也就'kill %job number'、'kill -kill %job number'、'kill [-kill] PID'。

 

 

 

 

 
 
相關文章
相關標籤/搜索