『學了就忘』Linux系統管理 — 85、工作管理相關命令

繁華似錦Fighting發表於2021-12-20

1、工作管理簡介

簡單的說,工作管理就是管理前臺的任務和後臺的任務。

後臺管理有幾個重要事項需要注意:

  1. 前臺是指當前可以操控和執行命令的這個操作環境,後臺是指工作可以自行執行,但是不能直接用ctrl+c來終止它,只能使用fg/bg來呼叫工作。
  2. 當前的登入終端,只能管理當前終端的工作,而不能管理其他登入終端的工作。如tty1登入的終端,是不能管理tty2終端中的工作的。
    也就是說哪一個終端放入後臺執行的程式,只有這個終端能檢視到,其他的終端是檢視不到該程式的。
    該終端一關閉,由這個終端放入後臺執行的程式也會終止。
    也可以關閉終端讓其放入後臺的程式不終止,在本文第4點。
  3. 放入後臺的命令必須可以持續執行一段時間,這樣我們才能撲捉和操作這個工作。如果把ls命令放入後臺執行,它很快就會執行完成,我們很難操作它。
  4. 放入後臺執行的命令不能和前臺使用者有互動或需要前臺輸入,否則放入後臺只能暫停,而不能執行。比如vim命令放入後臺只能暫停,而不能執行,因為vim需要前臺輸入資訊。
    還有一個top命令也不能放入後臺執行,而只能放入後臺暫停,因為top命令需要和前臺有互動。
    也就是說,不是所有的命令都是可以在後臺執行的, 只有這個程式不需要使用者介入才可以。比如說:打包壓縮、程式安裝等。(重點)

2、如何把命令放入後臺

有兩種方法,分別如下:

(1)方式一

使用命令 &,把命令放入後臺。

執行第一種把命令放入後臺的方法是在命令後面加入空格&,這種方法放入後臺的命令,在後臺是執行狀態。

但是注意,放入後臺執行的命令不能與前臺有互動,否則這個命令是不能在後臺執行的。

舉個例子:

# 1.打包etc目錄
# 將tar命令放入後臺執行,每個後臺命令會分配一個工作號,
# 命令既然可以執行,就會有程式產生,所以也會有程式號。
[root@localhost ~]# tar -zcf etc.tar.gz /etc &

# [工作號] 程式號
# 工作號:放入後臺的順序。
[1] 34567
[root@localhost ~]# tar: 從成員名中刪除開頭的“/”
tar: 從硬連線目標中刪除開頭的“/”
# 不清楚為何出現這兩行,不影響,可以忽略。

# 2.檢視後臺程式
# 使用jobs命令檢視
# 可以看到我們剛剛放入後臺正在執行的命令。
# 執行狀態Running。
[root@localhost ~]# jobs
[1]+  Running                 tar -zcf etc.tar.gz /etc &

# 3.放入後臺的命令執行完成後,會給你提示。
# 如果下面資訊在終端上出現:
# 證明後臺這個任務已經完成了,當然命令如果有執行結果的話,也會顯示到操作終端上。
# [1]是這個命令的工作號,+號代表這個任務是最近一個被放入後臺的工作。
[1]+  Done                    tar -zcf etc.tar.gz /etc

這樣的好處,雖然tar命令在執行,但是當前終端我還是可以進行其他命令操作的。

(2)方式二

第二種方法是在命令執行過程中按ctrl+z快捷鍵,命令在後臺是暫停狀態。

使用這種方法放入後臺的命令,就算是不和前臺有互動,能在後臺執行的命令,也是暫停狀態。換句話說就是把一個服務先暫停,在放入後臺。

ctrl+z快捷鍵就是暫停的快捷鍵。

示例:

# 還是上邊打包etc目錄
# 1.執行打包etc目錄命令,然後快速按下ctrl+z
[root@localhost ~]# tar -zcf etc.tar.gz /etc
tar: 從成員名中刪除開頭的“/”
tar: 從硬連線目標中刪除開頭的“/”
^Z  # 執行的過程中,按下ctrl+z快捷鍵
# 該tar命令被放入後臺,工作號是1,狀態是暫停。
[1]+  Stopped                 tar -zcf etc.tar.gz /etc

# 2.這個時候檢視後臺執行的程式
# 可以看到該tar命令在後臺是停止的狀態,工作號是1。
[root@localhost ~]# jobs
[1]+  Stopped                 tar -zcf etc.tar.gz /etc

通過ps aux命令也可以看到該程式。可以看他該程式的狀態是T,停止狀態。

如下圖所示:

image

也就是說,執行這個命令的程式就會一直卡在這。

你可以強制把這個程式kill掉,也可以把該程式恢復到前臺繼續進行操作(下一點會說明)。

3、後臺管理命令

(1)檢視後臺的工作

使用jobs命令,如下:

[root@localhost ~]# jobs -l

選項:
  -l:顯示工作的PID

示例:

[root@localhost ~]# jobs
[1]-  Stopped                 tar -zcf etc.tar.gz /etc
[2]+  Stopped                 top

# 代-l選項檢視
[root@localhost ~]# jobs -l
[1]-  6853 停止                  tar -zcf etc.tar.gz /etc
[2]+  6855 停止 (tty 輸出)     top
[root@Lyl ~]#

(2)將後臺暫停的工作恢復到前臺執行

使用fg命令,如下:

[root@localhost ~]# fg %工作號

引數:
  %工作號:%號可以省略,但是注意工作號和PID的區別

示例:

# 執行下面命令,會直接跳轉到top命令的互動介面
[root@localhost ~]# fg %2

(3)把後臺暫停的工作恢復到後臺執行

使用bg命令,如下:

[root@localhost ~]# bg %工作號

示例:

# 檢視後臺工作,可以看到tar命令是在後臺停止狀態
[root@localhost ~]# jobs -l
[1]+  6853 停止                  tar -zcf etc.tar.gz /etc

# 把後臺暫停的工作恢復到後臺執行
[root@localhost ~]# bg %1
[1]+ tar -zcf etc.tar.gz /etc &

# 檢視後臺工作,可以看到tar命令的狀態是完成,
# 等一小下,在執行jobs檢視後臺工作,就會沒有任何顯示了。
# 證明後臺停止的tar命令,已經在後臺執行完成了。
[root@localhost ~]# jobs -l
[1]+  6853 Done                    tar -zcf etc.tar.gz /etc

提示
你也可以直接把終端關閉掉,這些通過該終端被放入後臺的工作,也會消失。
當然這不是正確關閉後臺工作的方式。還是應該正確終止後臺工作之後,再關閉終端。

4、後臺命令脫離登入終端執行

我們已經知道把命令放入後臺,只能在當前登入終端執行。

那如果我是遠端管理的伺服器,在遠端終端中執行了後臺命令,這時我退出登入,這個後臺命令就不能繼續執行了,這個後臺命令會被終止。

但是我們確實需要在遠端終端中執行某些後臺命令,使這些命令在關閉終端的時候,也能夠繼續執行。

該如何執行呢?

  • 第一種方法是把需要後臺執行的命令加入/etc/rc.local檔案,讓系統在啟動時執行這個後臺程式。
    這種方法的問題是,伺服器時不能隨便重啟的,萬一有臨時後臺任務,伺服器不能重啟,就不能執行。
  • 第二種方法是使用系統定時任務,讓系統在指定的時間執行某個後臺命令。
    這樣放入後臺的命令與終端無關,是不依賴登入終端的。
  • 第三種方法是使用nohup命令
    nohup命令的作用就是讓後臺工作在離開操作終端時,也能夠正確的在後臺執行。
    命令的格式如下:
    [root@localhost ~]# nohup [命令] &
    
    例如:
    # 用find命令,打助/下所有檔案,放入後臺執行。
    [root@localhost ~]# nohup find / -print > /root/file.log &
    [3] 23496
    [root@localhost ~]# nohup:忽略輸入並把輸出追加到"nohup.out"
    
    

常見的還是用第三種方式處理。

相關文章