Linux下的後臺進程、nohup、輸出重定向

背景

Linux下,咱們通常經過SSH登陸到服務器進行操做,對於通常維護性命令,我直接輸入命令 makemake install 或腳本文件的路徑(相對路徑或絕對路徑)./configure 執行便可。
這就是前臺進程,用戶能夠經過控制檯看到命令執行的接口,能夠經過 Ctrl +C 結束進程。python

但當咱們想執行啓動一個服務,服務啓動後在同一個SSH會話裏繼續執行其餘命令;或者啓動服務後,但願SSH退出後服務能繼續運行,應該怎麼實現呢?服務器

咱們寫一個簡單的腳原本模擬長時間運行的程序。
腳本文件名稱: run.py命令行

#!/bin/python

from time import sleep

while True:
    sleep(1)
    print("x", end=" ", flush=True)

後臺進程

當啓動一個服務後,但願命令在後臺運行時,能夠經過在命令末尾增長 & ,例如:./run.py &,執行上述命令後,腳本開始在後臺運行,而且命令行回顯爲 [1] 12532 ,這裏的 1表示後臺進程的編號,能夠經過命令 fg 1 把進程切換回前臺運行。code

此時,雖然命令已經後臺運行了,咱們能夠在控制檯輸入其餘命令,可是腳本每秒打印的 x 會不斷的輸出到控制檯,影響咱們其餘命令的執行,這時,我也須要用輸出重定向把命令的執行結果輸出的文件中。接口

輸出重定向

一個程序執行後,系統會生成三個句柄,分別是:進程

  • 0=stdin(標準輸入)
  • 1=stdout(標準輸出)
  • 2=stderr(錯誤輸出)

默認狀況下,三個句柄都指向當前會話的命令行控制檯。命令轉到後臺執行後,stdin關閉,stdout和stderr仍是指向控制檯。import

經過在命令後使用輸出重定向符 > 實現對輸出的重定向。登錄

./run.py > run.log &

表示把stdout重定向到當前目錄的run.log文件。後臺

./run.py > run.log 2>&1 &

表示把stdoutstderr都重定向到run.log,其中 2>&1 表示把stderr重定向到stdout。程序

nohup

經過 & 雖然能夠把命令之後臺進程的方式執行,可是若是SSH會話中斷退出,和此會話相關的全部進程都會終止。
若是咱們是登陸服務器去啓動一個服務程序,總不能啓動後一直把SSH會話開着,並且會話到期會自動終止。

這是,咱們可使用 nohup(no hung up)來執行進程,此命令確保會話掛斷後,命令能夠繼續運行。以nohup運行的命令,系統默認自動把stdout和stderr重定向到當前目錄的nohup.out文件。

nohup ./run.py &

nohup和&的區別

  • &:已後臺進程執行命令,可是會話關閉後,進程會結束。
  • nohup:確保進程不掛斷的執行,可是沒有後臺執行的功能,因此通常nohup和&須要配合一塊兒使用。
相關文章
相關標籤/搜索