小技巧:讓linux程序在後臺運行

轉自: 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] 8510
delectate@delectate:~$ 
有幾點需要注意:
  1. 已經啓動的程序依然attach於當前pts,只有當前終端模擬器關閉(使用exit命令退出),進程自動被tty繼承。
    delectate@delectate:~$ ps -e | grep totem
        //程序已被以totem & 形式啓動,當前附在pts0上
    8819 pts/0    00:00:00 totem
    delectate@delectate:~$ ps -e | grep totem
       //pts0的模擬終端被exit命令關閉,totem自動附在tty
    8819 ?        00:00:00 totem
    delectate@delectate:~$
  2. 具有debug輸出的進程,需要按enter鍵進行中斷當前debug輸出。但是如果程序持續進行printf,你將無法輸入任何命令。
    delectate@delectate:~$ vlc &
    [1] 8850
    delectate@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 pressed
    delectate@delectate:~$                               //show a clean terminal now
    ** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL' failed
                                                                   //仍然在輸出數據……
                                                                   //關閉程序
    [1]+  Done                    vlc
    delectate@delectate:~$
  3. 你無法記錄程序的debug輸出結果。
  4. 只有當虛擬終端是 $ 或者 # 時候,纔可以關閉此終端,否則可能導致已經啓動的進程被關閉(按enter——如果程序持續輸出信息而沒有出現 $ 或 #)
  • 使用nohup命令:

nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起信號,使命令繼續執行)

但是當你嘗試使用命令:

1
nohup command

時候卻會遇到不大不小的麻煩……

delectate@delectate:~$ nohup vlc
nohup: ignoring input and appending output to `nohup.out'

是的,雖然它自動把debug信息記錄到nohup.out文件,但是你卻無法使用這個終端進行任何操作。

所以你需要和第一個方法混用,即

nohup command {option} &

混用後,它會自動把你執行的命令輸出結果記錄到權限爲-rw——-,名爲nohup.out的文件中。

但是你仍然需要

delectate@delectate:~$ nohup vlc &
[1] 9045
delectate@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 namekillall namekill pid
  • 命令應用:

linux服務器掛機下載;啓動相關服務;linux服務器啓動進程(尤其是ssh登錄)

我就曾經用
1
nohup aria2c -i downloadlist -m 0 -j 1 &

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章