以前使用Linux老是會不小心按下Ctrl + z,然后就出現看不懂的情況,以為程序突然就沒了,今天專門研究了下Linux下的幾個快捷鍵和工作管理。
其中找到一篇很不錯的文章,大部分是里面轉載的。
原文地址:http://blog.chinaunix.net/uid-26495963-id-3062757.html
一.Job的概念
Job是指在批處理的環境中,為完成某一任務而進行一系列操作的總稱。在個人接觸計算機的年代,批處理的環境已經不容見到了,只有一些特殊的行業和環境下還在使用這樣的概念,僅在書本中接觸過。
在Linux下,可以簡單的把Job理解為,一個或多個通過Pipe鏈接的命令及其運行所完成的任務。
例如,我需要把當前的登錄的用戶信息,記錄到名字為LoginUser的文件中,那么我可能回執行下面命令來完成:
lennon@lennon-laptop:~$ who > LoginUser
那們就可以把從命令的執行到LoginUser文件輸出的整個過程成為一個Job。
二.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命令。
通常我們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
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.
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 background
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.
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'。
