天天看點

Linux 背景運作程式方法總結目錄nohupdisownscreensetsid

  在用伺服器跑資料的時候經常會遇到資料量大,速度慢的情況,動不動需要用好幾天甚至上十天,但電腦總不能好幾天不關終端,且保證不斷網吧。是以這時候我們就需要将程式放到背景運作,不依賴于終端。關于原理,我們知道當使用者登出(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