開門見山,最近.NET勸退師要在linux上寫些長時間運行的腳本,獲取Azure BlobStorage存儲的數據。
記錄一下Linux中后台執行作業的命令。
Linux作業
作業(Job)是shell管理的進程(每個job都有一個關聯的PID),每個作業會被分配一個線性job ID。
有兩種形式的作業:
- Foreground: 當你在終端窗口輸入命令,這個命令將會占據終端窗口,直到命令執行完成, 這是一個前台Job
- Background: 當你在命令后面添加& 符號,命令將不會占據終端窗口(你可在shell prompt繼續輸入),這是一個后台Job
Linux作業控制命令
使用作業控制命令,您可以在Shell中運行和管理多個作業。但是你只能在啟動作業的Shell中使用作業控制命令。
命令 | 描述 |
---|---|
jobs | 列出所有的Job, 后面可接參數進行過濾 |
bg %n | 將當前/指定Job放置到后台運行 |
fg %n | 將當前/指定Job帶到前台運行 |
另外還有一些與作業有關的快速操作:
- & : 讓命令或者腳本在后台運行
- Ctrl+Z: 中斷前台作業,並放置在后台
- Ctrl+C: 終止當前前台作業
- nohup: 即使關閉終端也會執行(一般搭配上面的&)
在后台運行作業
在原命令的最后加上 &,可讓這個作業在后台運行。 下面的例子:在后台執行sleep命令
$ sleep 100 &
[1] 14488
shell返回結果: 中括號內是job ID, 后面是PID;
之后使用jobs命令查看狀態: 100s之后這個后台作業執行完成
[root@recv-data recv]# jobs
[1]+ Running sleep 100 &
....
[root@recv-data recv]# jobs
[1]+ Done sleep 100
管理作業
對於前台作業,
執行Ctrl+Z
可以將前台作業中止,並放置在后台; 之后可以使用bg %n
命令讓中止的后台作業跑起來。
# 將前台作業中止,並放置到后台
$ sleep 100
^Z
[1]+ Stopped sleep 100
$ jobs
[1]+ Stopped sleep 100
# bg命令讓后台中止的作業跑起來
$ bg % 1
[1]+ sleep 100 &
處於后台的作業,fg %n
切換回前台執行。
# 下面顯示一個正在運行的后台作業
$ jobs
[1]+ Running sleep 100 &
# 切換回前台運行
$ fg %1
sleep 100
眾所周知, Ctrl+C終止當前前台作業,不多說。
nohup:關閉終端也執行
很多時候,你是通過ssh登錄到遠程服務器,再執行Shell腳本或命令,如果你退出了終端(終止遠程連接),則該進程/命令將被殺死。如果不確定該作業何時完成,則最好讓該作業在后台運行,但是,如果你退出系統,該作業將被Shell停止並終止,當進程收到SIGHUP時,如何使作業在后台運行?
這個時候,我們就要使用nohup
命令,讓我們長時間運行的Shell腳本或命令在我們退出系統依舊能執行(此時一般搭配&
后台執行)。
顧名思義:nohup是用於忽略HUP(掛斷)信號的POSIX命令。
總結:
- 只能在初始化作業的shell里管控作業
- fg %n / bg %n 切換前后台作業
- nohup & 搭配,幫助長時間后台運行的作業,在你退出系統,依舊可運行