Linux 下在後臺執行程序
阿新 • • 發佈:2018-12-22
ssh 登入了遠端伺服器時,如果在前臺執行耗時較長的任務, 當 ssh 掉線或關閉視窗時會導致命令停止執行。
hup 與 nohup
當用戶登出(logout)或者網路斷開時,終端會收到 HUP(hangup)訊號從而關閉其所有子程序。有兩種解決辦法
- 讓程序忽略 HUP 訊號
- 讓程序執行在新的會話裡,從而成為不屬於此終端的子程序
nohup
nohup 的用途是讓提交的命令忽略 hangup 訊號。使用時只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤預設會被重定向到 nohup.out 檔案中。一般我們可在結尾加上 &
來將命令同時放入後臺執行,也可用 >filename 2>&1
setsid
setsid 命令可以切換程序所屬的終端。setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。
NAME setsid - run a program in a new session SYNOPSIS setsid program [arg...] DESCRIPTION setsid runs a program in a new session. OPTIONS -c, --ctty Set the controlling terminal to the current one.
關於 subshell
將一個或多個命名包含在“()”中就能讓這些命令在 subshell 中執行中。此時新提交的程序的父 ID(PPID)為1(init 程序的 PID),並不是當前終端的程序 ID。
將"&"也放入“()”內之後,所提交的作業並不在作業列表中,無法通過 jobs 來檢視,但可以通過 ps -ef
命令檢視。
disown
對於已經提交的命令,如果事先沒有使用 nohup 或者 setsid 來避免 HUP 訊號,可以通過作業排程(執行命令時結尾加 &
或者執行命令後使用 Ctrl + z)配合 disown 命令(這個命令只能用於作業)來補救。
- 用disown -h jobspec來使某個作業忽略HUP訊號。
- 用disown -ah 來使所有的作業都忽略HUP訊號。
- 用disown -rh 來使正在執行的作業忽略HUP訊號。
Ctrl + z
- Ctrl + z 會將當前程序掛起到後臺暫停執行。掛起後可用
jobs
命令檢視其作業號 - fg 可以將掛起的程序重新放回前臺繼續執行
- bg 來將掛起的程序放在後臺
這樣就可以在一個終端內靈活切換執行多個任務。
tmux
tmux 是 Linux 下常用的分屏工具,可以在一個終端中實現多個視窗,每個視窗又可以實現多個 pane 劃分。完整資料可以參考 這裡。