1.相關概念:
shell :命令解釋器,其實就是一個腳本語言解釋器,有很多種(bash,ash,tcsh等),最常用的是bash.
job(作業): 是相對shell 來說的,在shell中執行一條命令,實際上就是提交了一個job,只不過有的job需要運行很長時間,有的job很快就結束。
進程:命令經過shell解析后,交給系統內核執行,會fork出很多進程,他們同屬於登錄shell的進程組,如下圖。
所以作業是shell里面的一個概念,jobs命令只能查看當前shell自己的job,不同的shell 之間相互隔離。我們在shell里執行一條命令的時候就開啟了一個作業,一個作業對應着系統中的一個進程組,如果作業中的某個進程又創建了子進程,則子進程不屬於作業。
如何理解子進程不屬於作業呢?其實很簡單:
shell腳本自己也有語法,shell 腳本本身的運算都是作業內容,但是shell腳本中開啟其他進程則不是。
$: sleep 10000 && echo "====" &
以上代碼中&&前后兩條shell語句執行結束,則作業結束。
2.作業的分類。
作業可以分為前台作業和后台作業。
前台作業:需要占用終端的輸入、輸出。
后台作業:命令后面加&,后台job不占用shell的輸入輸出。例如: java Test &
一個shell在某一時刻可以同時運行一個前台作業和多個后台作業。
3.作業的操作:
對正在運行的前台作業:
ctl+z : 暫停前台(終端窗口中)正在運行job
ctl+c: 終止前台(終端窗口中)正在運行job
因為前台正在運行的作業只有一個,一個作業對應一個進程(jobs -l 可以查看進程ID),所以ctl+z ctl+z 實際上是對當前前台job對應的進程發送信號。
job的其他操作:
jobs: 顯示當前所有的job,包括正在運行的和暫停的。
fg+N : 讓暫停的job在前台運行,N=jobs 命令查詢的的job號
bg+N : 讓暫停的job在后台運行,N=jobs 命令查詢的的job號
kill %N : 終止job(與kill 進程不一樣,這里有%),N=jobs 命令查詢的的job號
擴展參考資料:
https://www.cnblogs.com/JohnABC/p/4079669.html
https://my.oschina.net/u/2467198/blog/619071
https://unix.stackexchange.com/questions/9082/difference-between-process-group-and-job
https://askubuntu.com/questions/506510/what-is-the-difference-between-terminal-console-shell-and-command-line
更多內容:http://skycity.today/?thread-192.htm