說到在Linux系統上後臺運行任務,可能很多人的第一反應是 nohup命令,可能還會有人提到 screen 命令。今天老張就給大家介紹這兩個命令,相信看完老張的介紹,大家可以根據實際情況靈活選擇使用二者。
01 nohup
先來看一下nohup的幫助文檔:
root@ubuntu:~# nohup --help
Usage: nohup COMMAND [ARG]...
or: nohup OPTION
Run COMMAND, ignoring hangup signals.
--help display this help and exit
--version output version information and exit
If standard input is a terminal, redirect it from an unreadable file.
If standard output is a terminal, append output to 'nohup.out' if possible,
'$HOME/nohup.out' otherwise.
If standard error is a terminal, redirect it to standard output.
To save output to FILE, use 'nohup COMMAND > FILE'.
nohup相對比較簡單,幫助文檔說的也比較明白。但是實際使用中往往需要配合一些其他的linux特性。
搭配“&”後臺運行
使用nohup啓動的程序會忽略hangup信號,hangup只是終止信號的一種,但是在關閉終端時,還會有其他的終止的信號,所以這時候往往需要配合 & 一起使用,這樣就可以做到不管是我們主動或者意外斷開終端,程序依然能夠繼續運行。
root@ubuntu:~# nohup COMMAND &
搭配“>”、“<”重定向輸入輸出
因爲nohup在缺省狀態下會將原本輸出到控制檯的stdout和stderr重定向至執行目錄下的nohup.out文件,在特殊需求的情況下需要配合linux的文件重定向自定義輸入輸出文件。下面的實例將標準輸入(0)、標準輸出(1)、標準錯誤(2)分別重定向至my.in、my.out、my.err。
root@ubuntu:~# nphup COMMDAND 0 < my.in 1 > my.out 2 > my.err
02 screen
比起nohup,screen要複雜的多,我們先來看一下screen官方給出的簡介。
屏幕是一個全屏窗口管理器,它在多個進程(通常是交互式外殼程序)之間多路複用物理終端。
……
當screen被調用的時候,它會創建一個帶有SHELL的窗口,你可以像平時操作SHELL一樣的運行你的進程。你可以隨時創建運行其他進程的窗口,殺死當前窗口,查看活動窗口的列表,打開和關閉輸出日誌記錄,在窗口裏面查看回滾歷史記錄,在窗口之間切換等。所有的窗口之間都是相互獨立的。即使斷開screen會話,進程依然能夠在後臺運行。
……
安裝screen
雖然使用screen需要用戶自己安裝,但是screen安裝相對簡單。
CentOS用戶可以使用yum安裝:
root@centos:~# yum install screen
Ubuntu用戶可以使用apt安裝:
root@ubuntu:~# apt install screen
screen的用法
screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s <shell>][-S <作業名稱>]
-A 將所有的視窗都調整爲目前終端機的大小。
-d<作業名稱> 將指定的screen作業離線。
-h<行數> 指定視窗的緩衝區行數。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r<作業名稱> 恢復離線的screen作業。
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s<shell> 指定建立新視窗時,所要執行的shell。
-S<作業名稱> 指定screen作業的名稱。
-v 顯示版本信息。
-x 恢復之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
-r 搭配 -S 可以非常方便的複用如數據庫查詢之類的某些需要打開的SHELL操作。
screen的快捷鍵
比起退出VIM來說,退出screen的難度恐怕也不遑多讓。進入screen窗口後,雖然感覺是操作與普通終端無異,但是screen本身也有許多快捷鍵,而這些快捷鍵都需要搭配Ctrl+a。
ctrl a ctrl a, 最近使用的兩個窗口之間切換
ctrl a + 數字, 切換到某個窗口
ctrl a + d, detach
ctrl a + k, 關閉當前窗口
ctrl a + :, 進入命令行模式
ctrl a C, 清空窗口數據
ctrl a + A, 修改當前窗口的名稱
以退出當前窗口爲例,需要先按下Ctrl+a,鬆開之後快速按d。更多的快捷鍵可以查閱官方文檔:
http://www.gnu.org/software/screen/manual/screen.html#Default-Key-Bindings
03 nohup VS screen
nohup | screen | |
開箱即用,無需安裝 | 是 | 否 |
易用性 | 高 | 低 |
支持窗口輸入、輸出 | 否 | 是 |
退出終端,進程繼續運行 | 可以,但是需要配合& | 可以 |
適用場景 | 單次運行、耗時很久的進程 | 除了支持後臺運行外,正常的終端操作也可以使用screen完成。 |