linux進程管理:進程,程式,執行緒 & 9個進程管理工具 & 作業控制

  • 2019 年 10 月 6 日
  • 筆記

程式

程式:一組指令以及參數集合,按照相應的邏輯控制電腦完成特性任務

(一個程式可以產生多個進程)

linux程式:系統,用戶,韌體

(包含指令,參數)

程式 ——》系統調用——-》快取(記憶體) ——-》cpu處理 執行任務

特點:靜態的,封閉的

進程

程式 ——-運行——-》進程1,進程2,進程3,…

進程:運行的程式,(動態),

(1)動態

(2)有生命周期

(3)運行狀態

(4)是作業系統上的基本單位 (從作業系統的核心來看,進程是作業系統分配的記憶體、CPU時間片等資源的基本單位。)

(5)特點:並發性,交互性

擴展:

應用(應用程式)

|

內核(內核文件,內核模組,驅動程式)

| 韌體(晶片+程式)

硬體

(1)作業系統以進程為單位分配系統資源

(2)每一個進程運行是獨立的,

(3)具有獨立的地址空間,運行狀態

(4)多個程式同時運行,每一個程式就是一個進程

執行緒

進程 ——-執行緒1,執行緒2,執行緒3,…——-》執行緒 把整個任務完成以後才能運行。

擴展:

(linux:進程,執行緒——-》都有獨立的資源集),入口,序列,出口。

執行緒:

(1)一個進程可有多個執行緒,一個執行緒只能為一個進程所擁有

(2)執行緒無法獨立運行,

程式和進程的區別

(1)程式是靜態的,它只是一組指令的集合,不具有任何的運行意義。而進程是程式運行的動態過程

(2)進程和程式並不是一一對應的關係,相同的程式運行在不同的數據集上就是不同的進程

(3)進程還具有並發性和交往性,而程式卻是封閉的

進程和執行緒的區別

(1)一個進程可以擁有多個執行緒,而一個執行緒同時只能被一個進程所擁有

(2)執行緒不能單獨執行,但是每一個執行緒都有程式的入口、執行序列以及程式出口,它必須組成進程才能被執行

進程的生命周期

父進程 ——-》子進程——》子進程

子進程擁有父進程的許可權,資源(特性),子進程可以運行自己的程式(exec),運行完退出(exit),然後喚醒父進程。如果這時子進程還有子進程還存在,就變成殭屍進程

父子進程的關係

子進程是由一個進程所產生的進程,產生這個子進程的進程稱為父進程 在linux系統中,使用系統調用fork創建進程。fork複製的內容包括父進程的數據和堆棧段以及父進程的進程環境。父進程終止子進程自然終止。

子進程繼承父進程的安全性身份、過去和當前的文件描述符、埠和資源特權、環境變數,以及程式程式碼。隨後,子進程可能exec自己的程式程式碼。通常,父進程在子進程運行期間處於睡眠(sleeping)狀態。當子進程完成時發出(exit)訊號請求,在退出時,子進程已經關閉或丟棄了其資源環境,剩餘的部分稱之為僵停(殭屍Zombie)。父進程在子進程退出時收到訊號而被喚醒,清理剩餘的結構,然後繼續執行其自己的程式程式碼。

檢測各種服務(service)的啟動狀態

該命令主要用於管理Linux作業系統中各種服務,它是一個腳本命令,會調用/etc/init.d/下面的各種服務啟動程式。

service SERVER status

OR

/etc/init.d/SERVER status

[root@CentOS6 etc]# service crond status  crond (pid  1373) is running...  

查看所有服務的狀態

命令service –status-all 將會運行所有的啟動腳本來顯示各個服務的運行狀態:

進程的管理工具 —9個

Linux進程管理工具pstree,ps、pgrep, pkill、uptime、top、htop、vmstat、lsof。

1. pstree

進程樹 查看進程之間的關係

-p :顯示pid

-u :顯示用戶

yum install pstree (CentOS6)

yum install psmsic (CentOS7)

[root@localhost ~]# pstree  init─┬─auditd───{auditd}       ├─crond       ├─login───bash       ├─master─┬─pickup       │        └─qmgr       ├─5*[mingetty]       ├─rsyslogd───3*[{rsyslogd}]       ├─sshd─┬─sshd───bash───pstree       │      └─sshd───sftp-server       └─udevd───2*[udevd]  

2. ps

a :顯示所有進程 -u :顯示以用戶為主的進程 x :和au配合使用,顯示完整資訊 -l :較長、較詳細的將該PID 的的資訊列出

[root@CentOS6 ~]# ps -a     PID TTY          TIME CMD    1701 pts/0    00:00:00 ps  [root@CentOS6 ~]# ps -u  Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ  USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  root       1388  0.0  0.0   4064   592 tty2     Ss+  19:39   0:00 /sbin/mingetty  root       1390  0.0  0.0   4064   592 tty3     Ss+  19:39   0:00 /sbin/mingetty  root       1392  0.0  0.0   4064   592 tty4     Ss+  19:39   0:00 /sbin/mingetty  root       1394  0.0  0.0   4064   592 tty5     Ss+  19:39   0:00 /sbin/mingetty  root       1396  0.0  0.0   4064   592 tty6     Ss+  19:39   0:00 /sbin/mingetty  root       1410  0.0  0.1 108316  1944 tty1     Ss+  19:40   0:00 -bash  root       1438  0.0  0.1 108316  1976 pts/0    Ss   19:49   0:00 -bash  root       1702  0.0  0.1 110244  1184 pts/0    R+   21:09   0:00 ps -u    

USER:該進程屬於那個使用者帳號。

PID :該進程的進程ID號。

%CPU:該進程使用掉的 CPU 資源百分比;

%MEM:該進程所佔用的物理記憶體百分比;

VSZ :該進程使用掉的虛擬記憶體量 (Kbytes)

RSS :該進程佔用的固定的記憶體量 (Kbytes)

TTY :該進程是在那個終端機上面運作,若與終端機無關,則顯示 ?。另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網路連接進主機的程式。

STAT:該程式目前的狀態,主要的狀態有:

R :該程式目前正在運作,或者是可被運作;

S :該程式目前正在睡眠當中,但可被某些訊號(signal) 喚醒。

T :該程式目前正在偵測或者是停止了;

Z :該程式應該已經終止,但是其父程式卻無法正常的終止他,造成 zombie (疆屍) 程式的狀態

START:該進程被觸發啟動的時間;

TIME :該進程實際使用 CPU 運作的時間。

COMMAND:該程式的實際指令。

[root@CentOS6 ~]# ps -l  F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD  4 S     0   1438   1429  0  80   0 - 27079 wait   pts/0    00:00:00 bash  4 R     0   1704   1438  0  80   0 - 27035 -      pts/0    00:00:00 ps  

F :代表這個程式的旗標 (flag),4 代表使用者為 superuser;.

S :代表這個程式的狀態 (STAT);sleeping,running

UID :代表執行者身份 # PID 進程的ID號!

PPID :父進程的ID;

C :CPU使用的資源百分比

PRI :指進程的執行優先權(Priority的簡寫),其值越小越早被執行;

NI :這個進程的nice值,其表示進程可被執行的優先順序的修正數值。

ADDR :這個是內核函數,指出該程式在記憶體的那個部分。如果是個執行的程式,一般就是『 – 』

SZ :使用掉的記憶體大小;

WCHAN :目前這個程式是否正在運作當中,若為 – 表示正在運作;

TTY :登入者的終端機位置;# TIME 使用掉的 CPU 時間。

CMD :所下達的指令名稱

3. pgrep

經常要查看進程的資訊,包括進程的是否已經消亡,通過pgrep來獲得正在被調度的進程的相關資訊。pgrep通過匹配其程式名,找到匹配的進程

-l 同時顯示進程名和PID

-o 當匹配多個進程時,顯示進程號最小的那個

-n 當匹配多個進程時,顯示進程號最大的那個

註:進程號越大,並不一定意味著進程的啟動時間越晚

[root@CentOS6 /]# pgrep sshd  1348  1429  1434  [root@CentOS6 /]# pgrep -l sshd  1348 sshd  1429 sshd  1434 sshd  [root@CentOS6 /]# pgrep -l -o sshd  1348 sshd  [root@CentOS6 /]# pgrep -o sshd  1348  [root@CentOS6 /]# pgrep -l -n sshd  1434 sshd  

4.kill

linux中的kill命令用來終止指定的進程的運行,是linux下進程管理的常用命令。可以使用kill命令殺死指定進程PID的I進程,如果要找到我們需要殺死的進程,還需要在之前使用ps等命令再配合grep來查找進程。

通常,終止一個前台進程可以使用Ctrl+c 鍵,但是,對於一個後台進程就必須用kill命令來終止,我們就需要先使用 ps /pidof /pstree /top等工具獲取進程PID,然後使用kill命令來殺掉進程。

kill命令是通過向進程發送指定的訊號來結束相應進程的。在默認情況下,採用編號為15的TERM訊號。TERM訊號將終止所有不能捕獲該訊號的進程。對於那些可以捕獲該訊號的進程就要用編號為9的kill訊號,強行「殺掉」該進程。

kill [選項] [進程id]

-l :訊號,若果不加訊號的編號參數,則使用「-l」參數會列出全部的訊號名稱

**-a :**當處理當前進程時,不限制命令名和進程號的對應關係

**-p :**指定kill 命令只列印相關進程的進程號,而不發送任何訊號

-s :指定發送訊號

-u :指定用戶

(1)kill命令可以帶訊號號碼選項,也可以不帶。如果沒有訊號號碼,kill命令就會發出終止訊號(15),這個訊號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的訊號。例如:

kill -2 123

#它的效果等同於在前台運行PID為123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9訊號。

(2)應注意,訊號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送訊號時必須小心,只有在萬不得已時,才用kill訊號(9),因為進程不能首先捕獲它。要撤銷所有的後台作業,可以輸入killall 或者 kill 0 。因為有些在後台運行的命令會啟動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用killall,kill 0 來終止所有由當前shell啟動的進程,是個有效的方法。在這裡注意:kill 0 中 0不代表訊號ID。(3)kill 0 不發送任何訊號,常用來檢測進程是否存在,在腳本中echo$?,存在返回0,不存在返回1。

4.1 列出所有訊號名稱:

[root@CentOS6 ~]# kill -l   1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP   6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1  11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM  16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP  21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ  26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR  31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1  64) SIGRTMAX  

說明: 只有第9種訊號(SIGKILL)才可以無條件終止進程,其他訊號進程都有權利忽略。下面是常用的訊號:

HUP        1      終端斷線  INT        2      中斷(同 Ctrl + C)  QUIT       3      退出(同 Ctrl + )  TERM       15    終止  KILL       9      強制終止  CONT       18    繼續(與STOP相反, fg/bg命令)  STOP       19     暫停(同 Ctrl + Z)  

4.2 先用ps查找進程,然後用kill殺掉

[root@CentOs7 ~]# ps -ef |grep vim  root       7755   7737  0 14:50 pts/1    00:00:00 grep --color=auto vim  [root@CentOs7 ~]# kill 7755  

4.3 徹底殺死進程

kill -9 7755 # -9 強制殺掉進程

5.killall

用於殺死指定名字的進程

-Z :只殺死擁有scontext 的進程

-e :要求匹配進程名稱

-I :忽略小寫

-g :殺死進程組而不是進程

-i :交互模式,殺死進程前先詢問用戶

-l :列出所有的已知訊號名稱

-q :不輸出警告資訊

-s :發送指定的訊號

-v :報告訊號是否成功發送

-w :等待進程死亡

–help :顯示幫助資訊

–version :顯示版本顯示

殺死所有同名進程

killall nginx

killall -9 bash

向進程發送指定訊號

killall -TERM ngixn 或者 killall -KILL nginx

6. pkill

pkill是ps命令和kill命令的結合,按照進程名來殺死指定進程,pkill和killall應用方法差不多,也是直接殺死運行中的程式;如果您想殺掉單個進程,請用kill來殺掉、

pkill [選項] [參數]

7.htop

先要安裝一個epel源,先搜索epel,然後安裝yum install epel-release

[root@CentOS6 ~]# yum list |grep epel  epel-release.noarch                       6-8                         extras  [root@CentOS6 ~]# yum install epel-release    

htop相比top其有著很多自身的優勢。如下:

兩者相比起來,top比較繁瑣

默認支援圖形介面的滑鼠操作

可以橫向或縱向滾動瀏覽進程列表,以便看到所有的進程和完整的命令行

殺進程時不需要輸入進程號等

htop跟top一樣,也是打開一個實時的監控介面,直接輸入htop命令打開如下圖所示介面:

在上圖中將輸出的介面劃分成了四個區域,其中:

上左區域:顯示了CPU、物理記憶體和交換分區的資訊;

上右區域:顯示了任務數量、平均負載和連接運行時間等資訊;

進程區域:顯示出當前系統中的所有進程;這裡同top顯示一致

以上各項分別為:

PID:進行的標識號

USER:運行此進程的用戶

PRI:進程的優先順序

NI:進程的優先順序別值,默認的為0,可以進行調整

VIRT:進程佔用的虛擬記憶體值

RES:進程佔用的物理記憶體值

SHR:進程佔用的共享記憶體值

S:進程的運行狀況,R表示正在運行、S表示休眠,等待喚醒、Z表示僵死狀態

%CPU:該進程佔用的CPU使用率

%MEM:該進程佔用的物理記憶體和總記憶體的百分比

TIME+:該進程啟動後佔用的總的CPU時間

COMMAND:進程啟動的啟動命令名稱

快捷鍵         快捷鍵           說明  h, ?           F1            查看htop使用說明  S              F2            htop 設定  /              F3            搜索進程                F4            增量進程過濾器  t              F5            顯示樹形結構  <, >           F6            選擇排序方式  [              F7            可減少nice值可以提高對應進程的優先順序  ]              F8            可增加nice值,降低對應進程的優先順序  k              F9            可對進程傳遞訊號  q              F10           結束htop  u                            只顯示一個給定的用戶的過程  U                            取消標記所有的進程  H                            顯示或隱藏用戶執行緒  K                            顯示或隱藏內核執行緒  F                            跟蹤進程  P                            按CPU 使用排序  M                            按記憶體使用排序  T                            按Time+ 使用排序  l                           顯示進程打開的文件  I                           倒轉排序順序  s                           選擇某進程,按s:用strace追蹤進程的系統調用  

F1:顯示幫助資訊

**F2:**配置介面中的顯示資訊

F3 :搜索進程 在介面下按F3或直接輸入」/」就可以直接進入搜索模式,是按照進程名進行搜索的。例如

**F4:**過濾器 相當於模糊查找,不區分大小寫,下方輸入要搜索的內容後,則介面只顯示搜索到的內容,更加方便查看,例如:

**F5:**以樹形方式顯示

**F6 :**排序方式

**F7,F8:**調整進程nice值

F7表示減小nice值(增大優先順序),F8增大nice值(減小優先順序),選擇某一進程,按F7或F8來增大或減小nice值,nice值範圍為-20-19,

**F9:**殺死進程

選擇某一進程按F9即可殺死此進程,很方便

F10:退出htop

8. vmstat

vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀態值,包括伺服器的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況。vmstat的好處:一個是Linux/Unix都支援,二是相比top,可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個進程的CPU使用率和記憶體使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是取樣的時間間隔數,單位是秒,第二個參數是取樣的次數,如:

[root@CentOS6 ~]# vmstat  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st   0  0      0 569324  21580 275176    0    0    18     3   13   11  0  0 99  0  0  [root@CentOS6 ~]# vmstat 2 1  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st   0  0      0 569340  21580 275176    0    0    18     3   13   11  0  0 99  0  0  [root@CentOS6 ~]# vmstat 2 5  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st   0  0      0 569340  21580 275176    0    0    18     3   13   11  0  0 99  0  0   0  0      0 569292  21580 275176    0    0     0     0   12   10  0  0 100  0  0   0  0      0 569292  21580 275176    0    0     0     0   13   10  0  0 100  0  0   0  0      0 569292  21580 275176    0    0     0     0   10   10  0  0 100  0  0   0  0      0 569292  21580 275176    0    0     0     0   10   12  0  0 100  0  0  

注意:如果評估CPU,需要重點關注procs項的r列值和CPU想的us、sy、wa列的值

-V:顯示vmstat版本資訊

-n:只在開始時顯示一次各欄位名稱

-a:顯示活躍和非活躍記憶體

-d:顯示各個磁碟相關統計資訊

-D:顯示磁碟總體資訊

-p:顯示指定磁碟分區統計資訊

-s:顯示記憶體相關統計資訊及多種系統活動數量

-m:顯示slabinfo

-t:在輸出資訊的時候也將時間一併輸出出來

-S:使用指定單位顯示。參數有k、K、m、M,分別代表1000、1024、1000000、1048576位元組(byte)。默認單位為K(1024bytes)

delay:刷新時間間隔。如果不指定,只顯示一條結果

count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮

9.lsof

lsof輸出資訊含義 在終端下輸入lsof即可顯示系統打開的文件,因為 lsof 需要訪問核心記憶體和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。

[root@CentOS6 etc]# lsof  COMMAND    PID   USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME  init         1   root  cwd       DIR                8,2     4096          2 /  init         1   root  rtd       DIR                8,2     4096          2 /  init         1   root  txt       REG                8,2   150352     393266 /sbin/init  init         1   root  mem       REG                8,2    65960       2622 /lib64/libnss_files-2.12.so  init         1   root  mem       REG                8,2  1923352       2606 /lib64/libc-2.12.so  init         1   root  mem       REG                8,2    90880         16 /lib64/libgcc_s-4.4.7-20120601.so.1  init         1   root  mem       REG                8,2    43944       2634 /lib64/librt-2.12.so  

每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件。lsof輸出各列資訊的意義如下:

COMMAND:進程的名稱

PID:進程標識符

USER:進程所有者

FD:文件描述符,應用程式通過文件描述符識別該文件。如cwd、txt等

TYPE:文件類型,如DIR、REG等

(1)DIR:表示目錄

(2)CHR:表示字元類型

(3)BLK:塊設備類型

(4)UNIX: UNIX 域套接字

(5)FIFO:先進先出 (FIFO) 隊列

(6)IPv4:網際協議 (IP) 套接字

DEVICE:指定磁碟的名稱

SIZE:文件的大小

NODE:索引節點(文件在磁碟上的標識)

NAME:打開文件的確切名稱

參數:

lsof abc.txt 顯示開啟文件abc.txt的進程

lsof -c abc 顯示出以字母 abc 開頭進程現在打開的文件

lsof -p 1234 列出進程號為1234的進程所打開的文件

lsof -g gname/gid 顯示歸屬gname或gid的進程情況

lsof -u uname/uid 顯示歸屬uname或uid的進程情況

lsof +d /usr/local/ 顯示目錄下被進程開啟的文件

lsof +D /usr/local/ 同上,但是會搜索目錄下的目錄,時間較長

lsof -d 4 顯示使用fd為4的進程

lsof -i 用以顯示符合條件的進程情況

lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

46 –> IPv4 or IPv6

protocol –> TCP or UDP

hostname –> Internet host name

hostaddr –> IPv4地址

service –> /etc/service中的 service name (可以不止一個)

port –> 埠號 (可以不止一個)

進程優先順序

Linux 進程調度及多任務:

每個CPU(或CPU核心)在一個時間點上只能處理一個進程,通過時間片技術,

Linux實際能夠運行的進程(和執行緒數)可以超出實際可用的CPU及核心數量。Linux內核進程調度程式將多個進程在CPU核心上快速切換,從而給用戶多個進程在同時運行的印象。

進程優先順序劃分:【0-139】

【0-99】 有效實時優先順序

(值越小,優先順序越高)

【100-139】 非有效實時優先順序 ——–調整 nice 【-20-19】

(值越小,優先順序越高)

相對優先順序nice :-20 – 19

PR:靜態優先順序-100

NI:nice值

nice值調整

top 「r」 –enter;輸入PID–enter;輸入nice值–enter;

renice 【-20,10】PPID

htop F7(-) F8(+)

[root@CentOS6 ~]# sleep 5000 &  [1] 1859  [root@CentOS6 ~]# renice -20 1859  1859: old priority 0, new priority -20  

進程前後台

前台進程:在 shell 提示處理打入命令後,創建一個子進程,運行命令, Shell 等待命令退出,然後返回到對用戶給出提示符。這條命令與 Shell 非同步運行,即在前台運行,用戶在它完成之前不能執行別一個命令 。

後台進程:在 Shell 提示處打入命令,若後隨一個 &, Shell 創建子進程運行此命令,但不等待命令退出,而直接返回到對用戶給出提示。這條命令與 Shell 同步運行,即在後台運行。「後台進程必須是非互動式的」 。

進程的狀態

進程的狀態:準備狀態,就緒狀態,運行狀態,阻塞狀態,休眠狀態,死亡狀態

殭屍進程(將死狀態):父進程死掉,子進程還在

sleeping :睡眠狀態

stopping:停止狀態

running:運行狀態

zombie:僵死狀態

這些狀態是實時變化的

作業控制

當我們在Linux的shell中運行程式時,這個程式就可以看成是一個作業了,可以這麼說shell控制的是作業,而不是進程,而且shell還可以分前後台對作業進行控制。

進程和作業的區別:

區別:進程是一個程式在一個數據集上的一次執行,而作業是用戶提交給系統的一個任務。

關係:一個作業通常包括幾個進程,幾個進程共同完成一個任務,即作業。

用戶提交作業以後,當作業被調度,系統會為作業創建進程,一個進程無法完成時,系統會為這個進程創建子進程。

作業控制:

一個前台作業可以由多個進程組成,一個後台作業也可以由多個進程組成,Shell可以同時運行一個前台作業和任意多個後台作業,這稱為作業控制(Job Control)。

在前台一次只能運行一個作業。

在後台可以運行多個作業

ping 192.168.42.2 > /dev/null 2>&1 & #要把ping的結果輸出到一個文件夾里(> /dev/null 2),不然它雖然還是在後台運行,但在前台輸出結果;不過不影響前台作業執行

[root@CentOS6 ~]# ping 192.168.42.2 > /dev/null 2>&1 &  [1] 1869  [root@CentOS6 ~]# ps -ef |grep ping  root       1869   1773  0 01:34 pts/1    00:00:00 ping 192.168.42.2  root       1872   1773  0 01:35 pts/1    00:00:00 grep ping  [root@CentOS6 ~]# kill 1869  [root@CentOS6 ~]# ps -ef |grep ping  root       1874   1773  0 01:37 pts/1    00:00:00 grep ping  [1]+  Terminated              ping 192.168.42.2 > /dev/null 2>&1  [root@CentOS6 ~]# ps -ef |grep ping  root       1876   1773  0 01:37 pts/1    00:00:00 grep ping  

1.jobs 查看後台作業;與終端,不同終端上的作業要在對應終端上查看。 +:代表最近一個放入後台的作業, -:代表倒數第二個放入後頭的作業 (只顯示在兩個作業上)

[root@CentOS6 ~]# ping 192.168.42.2 > /dev/null 2>&1 &  [1] 1877  [root@CentOS6 ~]# jobs  [1]+  Running                 ping 192.168.42.2 > /dev/null 2>&1 &  

2. fg %job編號 :把作業恢復到前台運行起來 3. bg %job編號 :把作業恢復到後台運行起來 4. ctrl + z :讓前台的程式掛起 轉到後台(讓作業處於Stopped狀態)

[root@CentOS6 ~]# jobs  [1]-  Running                 ping 192.168.42.2 > /dev/null 2>&1 &  [2]+  Running                 sleep 8000 &  [root@CentOS6 ~]# bg %2  -bash: bg: job 2 already in background  [root@CentOS6 ~]# fg %1  ping 192.168.42.2 > /dev/null 2>&1    ^Z  [1]+  Stopped                 ping 192.168.42.2 > /dev/null 2>&1  [root@CentOS6 ~]# jobs  [1]+  Stopped                 ping 192.168.42.2 > /dev/null 2>&1  [2]-  Running                 sleep 8000 &  [root@CentOS6 ~]# bg %1  [1]+ ping 192.168.42.2 > /dev/null 2>&1 &  [root@CentOS6 ~]# jobs  [1]-  Running                 ping 192.168.42.2 > /dev/null 2>&1 &  [2]+  Running                 sleep 8000 &  

5. kill %job編號 :先停止,在殺死。 ping 192.168.42.2 & 已經在後台運行,在前台輸出結果;不影響前台作業執行

[root@CentOS6 ~]# ping 8.8.8.8 &  [3] 1928  [root@CentOS6 ~]# PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.  64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=125 ms  l64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=74.2 ms  s  aaa                                           passwd  anaconda-ks.cfg                               ping.sh  ansible-2.4.2.0-2.el7.noarch.rpm              pub  apache-tomcat-8.0.36.tar.gz                   tar  centos-release-scl-2-3.el7.centos.noarch.rpm  TECH  eth0                                          TECH-1  file1                                         test  install.log                                   test1.sh  install.log.syslog                            time.log  jdk-8u161-linux-x64.tar.gz                    time.sh  kkk                                           txt  messages                                      wget-log  [root@CentOS6 ~]# 64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=71.9 ms  64 bytes from 8.8.8.8: icmp_seq=5 ttl=128 time=72.6 ms  64 bytes from 8.8.8.8: icmp_seq=32 ttl=128 time=73.4 ms  k64 bytes from 8.8.8.8: icmp_seq=33 ttl=128 time=73.6 ms  ill64 bytes from 8.8.8.8: icmp_seq=34 ttl=128 time=73.3 ms  64 bytes from 8.8.8.8: icmp_seq=35 ttl=128 time=73.7 ms   64 bytes from 8.8.8.8: icmp_seq=36 ttl=128 time=73.7 ms  %64 bytes from 8.8.8.8: icmp_seq=37 ttl=128 time=73.1 ms  364 bytes from 8.8.8.8: icmp_seq=38 ttl=128 time=72.8 ms