1. 程式人生 > >Linux 下在後臺執行程序

Linux 下在後臺執行程序

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 劃分。完整資料可以參考 這裡