這篇文章翻譯自: http://linuxcommand.org/lts0080.phpphp
上一課咱們看到了Linux做爲一個多用戶系統的複雜之處(權限), 這一課咱們來學習Linux的多任務特性和在命令行界面的操做方法.linux
如任何多任務系統同樣, Linux執行的是多個同步的進程. 好吧, 它們只是看上去同步罷了. 實際上, 一個單處理器電腦在同一時間只能運行一個進程, 但Linux內核想辦法給每一個進程都有時間片輪流執行, 這樣看上去它們就是同步的了.shell
咱們有幾個控制進程的命令:小程序
ps
- 把進程系統的列出 (注: 只有ps -A
能列出系統全部進程, ps
只能列出當前進程和它的子進程)kill
- 發送一個信號給進程 (一般用做殺進程)jobs
- 另外一種方法, 列出你的進程bg
- 將一個進程放到後臺執行fg
- 講一個進程拉到前臺執行雖然說這個話題有那麼點低級, 可是對於那些長期用圖形界面的普通用戶來講是頗有實際意義的. 你可能不知道, 大多(即使不是全部)圖形界面程序都能在命令行啓動. 例如, 有一個帶有X Windows系統的小程序xload
, 它能顯示一張圖形以表明系統啓動. 你能夠鍵入下面這些來啓動它:編輯器
shell[me@linuxbox me]$ xload
請留意到xload窗口出現而且顯示了圖形, 同時也該留意到提示符在程序啓動以後再也不出現. shell在等待(wait()
)程序完結, 而後才把控制權交還給你. 若是你關掉xload窗口, xload
程序終止, 提示符從新出現.學習
好, 爲了改善生活, 咱們要從新啓動xload, 不過此次咱們把它放到後臺, 這樣提示符就會回來了. 要作到這一點, 這樣執行就好:操作系統
shell[me@linuxbox me]$ xload & [1] 1223 [me@linuxbox me]$
在這個例子中, 提示符返回了, 由於程序被放到了後臺.命令行
如今想象一下你在執行一個後臺的程序時, 把&符號打漏了. DON'T PANIC, 仍是有但願的. 你先按下 Control-Z, 這樣程序掛起. 程序仍是在的, 只不過被閒置着. 要想在後臺恢復它的運行, 運行bg
(background的縮寫):翻譯
shell[me@linuxbox me]$ xload [2]+ Stopped xload [me@linuxbox me]$ bg [2]+ xload &
如今咱們把一個進程放到了後臺, 這樣列出咱們啓動了的進程就變得至關有用. 咱們能夠用jobs
或者ps
來完成這一點:code
shell[me@linuxbox me]$ jobs [1]+ Running xload & [me@linuxbox me]$ ps PID TTY TIME CMD 1211 pts/4 00:00:00 shell 1246 pts/4 00:00:00 xload 1247 pts/4 00:00:00 ps [me@linuxbox me]$
設想有個程序無響應了(hmmm...Netscape浮如今腦中 ;-); 怎麼把它弄走? 固然, 你能夠用kill
命令. 咱們來在xload上試試刀. 首先你得獲得那個將被殺的程序的標識. 你能夠用ps或者jobs, 用jobs獲得job號, 用ps獲得進程id (PID). 咱們兩個都試一下:
shell[me@linuxbox me]$ xload & [1] 1292 [me@linuxbox me]$ jobs [1]+ Running xload & [me@linuxbox me]$ kill %1 [me@linuxbox me]$ xload & [2] 1293 [1] Terminated xload [me@linuxbox me]$ ps PID TTY TIME CMD 1280 pts/5 00:00:00 shell 1293 pts/5 00:00:00 xload 1294 pts/5 00:00:00 ps [me@linuxbox me]$ kill 1293 [2]+ Terminated xload [me@linuxbox me]$
"kill"命令一般用做殺進程, 而它的的做用實際上是向進程發送一個信號. 大多數時候信號就是告訴程序"好了別再運行了", 而後沒有而後了. 程序監聽和迴應操做系統信號(若是它們寫得好), 大多數時候都是爲了能有一個更優雅的終止方式(死法). 例如, 一個文本編輯器可能要監聽用戶是否是要登出, 或者電腦是否是要關機. 當它收到這些信號, 它就得在退出以前保存工做. kill命令能法送一大堆不一樣的信號呢, 鍵入:
shellkill -l
就會列出它支持的信號. 大多都比較晦澀, 不過有幾個是蠻經常使用:
Num | Name | Description |
---|---|---|
1 | SIGHUP | 掛起信號. 程序能夠監聽並決定是否掛起(注: 見nohup命令和Control-Z) |
2 | SIGINT | 中斷信號. 這個信號但願讓進程中斷的, 固然最終的行爲由進程本身決定. 你能夠在終端按Control-C(aka, 鍵盤中斷)來發出這個信號. |
15 | SIGTERM | 終止信號. 這個信號但願讓進程終止的, 最終的行爲仍由進程本身決定. 這是kill命令默認發出的信號. |
9 | SIGKILL | 殺信號. 這個信號用於當即終止進程. 它由內核發出, 沒法監聽和處理. |
好如今設想你有一個進程已經毫無但願地卡在那裏了(好比可憐地Netscape), 你要停掉它, 你該這樣作:
shell[me@linuxbox me]$ ps x PID TTY STAT TIME COMMAND 2931 pts/5 SN 0:00 netscape [me@linuxbox me]$ kill -SIGTERM 2931 [me@linuxbox me]$ kill -SIGKILL 2931
這個例子中, 我以一個更加形式化的寫法來用kill命令. 在實際應用中, 下面這個更經常使用, 由於kill默認發出SIGTERM, -信號也能夠用數字而不是名字來代替:
shell[me@linuxbox me]$ kill 2931
若是進程還不終止, 那就用SIGKILL強制終止:
shell[me@linuxbox me]$ kill -9 2931
這在"Learning the shell"系列課程中的最後一個. 下一個系列, "寫shell腳本", 咱們將學習如何用shell腳本自動化任務.