怎么理解linux作業(job),與進程(process)的關系


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM