Linux下,咱們通常經過SSH登陸到服務器進行操做,對於通常維護性命令,我直接輸入命令 make
、make 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
會不斷的輸出到控制檯,影響咱們其餘命令的執行,這時,我也須要用輸出重定向把命令的執行結果輸出的文件中。接口
一個程序執行後,系統會生成三個句柄,分別是:進程
默認狀況下,三個句柄都指向當前會話的命令行控制檯。命令轉到後臺執行後,stdin關閉,stdout和stderr仍是指向控制檯。import
經過在命令後使用輸出重定向符 >
實現對輸出的重定向。登錄
./run.py > run.log &
表示把stdout重定向到當前目錄的run.log文件。後臺
./run.py > run.log 2>&1 &
表示把stdout和stderr都重定向到run.log,其中 2>&1
表示把stderr重定向到stdout。程序
經過 &
雖然能夠把命令之後臺進程的方式執行,可是若是SSH會話中斷退出,和此會話相關的全部進程都會終止。
若是咱們是登陸服務器去啓動一個服務程序,總不能啓動後一直把SSH會話開着,並且會話到期會自動終止。
這是,咱們可使用 nohup
(no hung up)來執行進程,此命令確保會話掛斷後,命令能夠繼續運行。以nohup運行的命令,系統默認自動把stdout和stderr重定向到當前目錄的nohup.out文件。
nohup ./run.py &