轉自: https://www.deleak.com/blog/2010/05/19/run-software-on-background/ 有些時候,我們需要在終端啟動一個程式,並使之運行——但是如果關閉終端,那麼這個程式也就隨著關閉了。那麼有沒有什麼方法在關閉終端後,讓已經從這個終端啟動的程式繼續運行呢?
前置知識:
xterm,console,tty,pts,pty的區別
- shell是直接和核心進行通訊的東西
- xterm是一個軟體概念,可以通過這個程式串連到console從而控制主機,可以理解為cli形式的終端模擬器,而gnome-terminal,konsole就是gui形式的終端模擬器
- console是主機的控制台,是一個物理概念。
- tty、pty、pts都是終端,是硬體或者裝置概念。
- tty是所有終端裝置的總稱
- pty是其中一類,偽終端,或者叫虛擬終端
在Unix/Linux下如果想讓程式獨立終端運行,一般都是使用 & 在命令結尾來讓程式自動運行。(命令後可以不追加空格) 開啟gnome-terminal,執行如下命令: delectate@delectate:~$ totem &[1] 8510delectate@delectate:~$ 有幾點需要注意:
- 已經啟動的程式依然attach於當前pts,只有當前終端模擬器關閉(使用exit命令退出),進程自動被tty繼承。
delectate@delectate:~$ ps -e | grep totem //程式已被以totem & 形式啟動,當前附在pts0上8819 pts/0 00:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的類比終端被exit命令關閉,totem自動附在tty8819 ? 00:00:00 totemdelectate@delectate:~$
- 具有debug輸出的進程,需要按enter鍵進行中斷當前debug輸出。但是如果程式持續進行printf,你將無法輸入任何命令。
delectate@delectate:~$ vlc &[1] 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye[0x8b998b0] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface. //enter presseddelectate@delectate:~$ //show a clean terminal now** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL' failed //仍然在輸出資料…… //關閉程式[1]+ Done vlcdelectate@delectate:~$
- 你無法記錄程式的debug輸出結果。
- 只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經啟動的進程被關閉(按enter——如果程式持續輸出資訊而沒有出現 $ 或 #)
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起訊號,使命令繼續執行) 但是當你嘗試使用命令:
時候卻會遇到不大不小的麻煩…… delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out' 是的,雖然它自動把debug資訊記錄到nohup.out檔案,但是你卻無法使用這個終端進行任何操作。 所以你需要和第一個方法混用,即 nohup command {option} & 混用後,它會自動把你執行的命令輸出結果記錄到許可權為-rw——-,名為nohup.out的檔案中。 但是你仍然需要 delectate@delectate:~$ nohup vlc &[1] 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out' //在這裡按一下斷行符號或以ctrl+c以 //show a clean terminal delectate@delectate:~$ 與使用 “&” 性質相同,當前啟動程式的終端如果沒有被關閉,已經啟動的程式附在pst上;如果終端被關閉,則自動附在tty。 如果目前的目錄的 nohup.out 檔案不可寫,輸出重新導向到 $HOME/nohup.out。預設狀態下,nohup預設輸出到nohup.out檔案,你也可以利用重新導向來指定輸出檔案: nohup command {option} > myout.file 2>&1 & 只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經啟動的進程被關閉(按enter——如果程式持續輸出資訊而沒有出現 $ 或 #)
jobs:查看當前有多少在後台啟動並執行命令 fg:將後台中的命令調至前台繼續運行。如果後台中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid) bg:將一個在後台暫停命令,變成繼續執行。如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid)
殺死已經啟動的程式和普通方式一樣:
- pkill -9 name
- killall name
- kill pid
- …
linux伺服器掛機下載;啟動相關服務;linux伺服器啟動進程(尤其是ssh登入) 我就曾經用
1 |
nohup aria2c -i downloadlist -m 0 -j 1 & |
|