在用伺服器跑資料的時候經常會遇到資料量大,速度慢的情況,動不動需要用好幾天甚至上十天,但電腦總不能好幾天不關終端,且保證不斷網吧。是以這時候我們就需要将程式放到背景運作,不依賴于終端。關于原理,我們知道當使用者登出(logout)或者網絡斷開時,終端會收到 HUP(hangup)信号進而關閉其所有子程序。是以,我們的解決辦法就有兩種途徑:一是讓程序忽略 HUP 信号,二是讓程序運作在新的會話裡進而成為不屬于此終端的子程序。
目錄
nohup
disown
screen
setsid
nohup
顧名思義,nohup 的用途就是讓送出的指令忽略 hangup 信号,屬于第一種途徑。我一般是這樣子用:
nohup python -u train_au.py >trian_log >& &
# 注釋
# 格式:nohup command args
# > train_log 标準輸出重定向到檔案中
# 2>&1 标準錯誤也輸出到檔案中
# 最後一個 & 表示加到背景
disown
有時候我們程式跑起來才發現忘了放背景運作,這時候怎麼辦呢?當然不是看着辦,而是有很好的辦法解決:
# 通過以下操作即可解決
ctrl+z # 将程式挂起
jobs # 檢視作業号
bg job_id # 放到背景運作
disown -h %job_id
screen
這種方法是師兄教我的,Screen是一款由GNU計劃開發的用于指令行終端切換的自由軟體。使用者可以通過該軟體同時連接配接多個本地或遠端的指令行會話,并在其間自由切換 。使用screen後其是是 init(PID為1)的子程序,這樣也不會受到HUP信号的影響。
screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]
-A 将所有的視窗都調整為目前終端機的大小。
-d <作業名稱> 将指定的screen作業離線。
-h <行數> 指定視窗的緩沖區行數。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r <作業名稱> 恢複離線的screen作業。
-R 先試圖恢複離線的作業。若找不到離線的作業,即建立新的screen作業。
-s 指定建立新視窗時,所要執行的shell。
-S <作業名稱> 指定screen作業的名稱。
-v 顯示版本資訊。
-x 恢複之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,并删除已經無法使用的screen作業。
# 常見用法
screen -S name -> 建立一個叫name的session
screen -dms name ->建立一個detach的session
screen -ls -> 列出目前所有的session
screen -r name -> 回到name這個session
screen -d name -> 遠端detach某個session # CTRL-a d快捷鍵終端目前Session
screen -d -r name -> 結束目前session并回到name這個session
setsid
屬于第二種政策,程序不屬于接受 HUP 信号的終端的子程序,那麼自然也就不會受到 HUP 信号的影響。
setsid # set session id
Usage:
setsid [options] <program> [arguments ...]
Run a program in a new session.
Options:
-c, --ctty set the controlling terminal to the current one
-w, --wait wait program to exit, and use the same return
-h, --help display this help and exit
-V, --version output version information and exit
setsid python train.py