1、工作管理簡介
簡單的說,工作管理就是管理前臺的任務和後臺的任務。
後臺管理有幾個重要事項需要注意:
- 前臺是指當前可以操控和執行命令的這個操作環境,後臺是指工作可以自行執行,但是不能直接用
ctrl+c
來終止它,只能使用fg/bg
來呼叫工作。 - 當前的登入終端,只能管理當前終端的工作,而不能管理其他登入終端的工作。如
tty1
登入的終端,是不能管理tty2
終端中的工作的。
也就是說哪一個終端放入後臺執行的程式,只有這個終端能檢視到,其他的終端是檢視不到該程式的。
該終端一關閉,由這個終端放入後臺執行的程式也會終止。
也可以關閉終端讓其放入後臺的程式不終止,在本文第4點。 - 放入後臺的命令必須可以持續執行一段時間,這樣我們才能撲捉和操作這個工作。如果把
ls
命令放入後臺執行,它很快就會執行完成,我們很難操作它。 - 放入後臺執行的命令不能和前臺使用者有互動或需要前臺輸入,否則放入後臺只能暫停,而不能執行。比如
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
,停止狀態。
如下圖所示:
也就是說,執行這個命令的程式就會一直卡在這。
你可以強制把這個程式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"
常見的還是用第三種方式處理。