linux 讓你的進程後臺運行

fg、bg、jobs、&、ctrl + z都是跟系統任務有關的,雖然現在基本上不怎麼需要用到這些命令,但學會了也是很實用的
一。& 最經常被用到
   這個用在一個命令的最後,可以把這個命令放到後臺執行
二。ctrl + z
     可以將一個正在前臺執行的命令放到後臺,並且暫停
三。jobs
     查看當前有多少在後臺運行的命令
四。fg
     將後臺中的命令調至前臺繼續運行
   如果後臺中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)
五。bg
     將一個在後臺暫停的命令,變成繼續執行
   如果後臺中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)
    

 

當前正在運行的程序用    CTRL+z來掛入後臺,用fg 來喚醒.可以進行多進程切換.

 

Unix/Linux下一般比如想讓某個程序在後臺運行,很多都是使用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在後臺:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

但是加入我們很多程序並不象mysqld一樣做成守護進程,可能我們的程序只是普通程序而已,一般這種程序使用 & 結尾,

 

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。

如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。

如果沒有文件能創建或打開以用於追加,那麼 Command 參數指定的命令不可調用。

如果標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的所有輸出作爲標準輸出重定向到相同的文件描述符。

退出狀態

該命令返回下列出口值:

126 可以查找但不能調用 Command 參數指定的命令。

127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。

否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。

示例

要運行註銷後後臺中的命令,請輸入:

$ nohup find / -print &

輸入該命令後,顯示如下:

670$ 輸出發送到 nohup.out

進程 ID 號更改爲 & (表示“and”的符號)啓動的後臺進程的 ID 號。

消息 輸出發送到 nohup.out 通知您來自 find / -print 命令的輸出在 nohup.out 文件中。

查看這些消息後可以註銷,即使 find 命令仍在運行。

要運行後臺中的命令並且把標準輸出重定向到一個不同的文件,請輸入:

$ nohup find / -print >filenames &

本例運行 find / -print 命令並且把輸出存儲到命名爲 filenames 的文件中。現在只顯示進程 ID 和提示:

677$

因爲 nohup 命令需要片刻時間來啓動 Command 參數指定的命令,在註銷前請等待。

如果太快註銷,Command 參數指定的命令可能根本沒運行。一旦 Command 參數指定的命令啓動,註銷就不會對其產生影響。

要運行不止一條命令,請使用 shell 過程。例如,如果寫 shell 過程:

neqn math1 | nroff > fmath1

且命名它爲  nnfmath1 文件,那麼可以爲 nnfmath1 文件中所有命令運行 nohup 命令,命令爲:

nohup sh nnfmath1

如果給 nnfmath1 文件分配執行許可權,那麼可以通過發出如下命令得到相同的結果:

nohup nnfmath1

要在後臺中運行 nnfmath1 文件,請輸入:

nohup nnfmath1  &

要在 Korn shell 中運行 nnfmath1 文件,請輸入:

nohup ksh nnfmath1

如果使用nohup命令提交作業,那麼在缺省情況下該作業的所有輸出都被重定向到一個名爲nohup.out的文件中,除非另外指定了輸出文件:

  nohup command > myout.file 2>&1 &
  在上面的例子中,輸出被重定向到myout.file文件中。
  使用 jobs 查看任務。
  使用 fg %n 關閉。
 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
雖然nohup很容易使用,但還是比較”簡陋”的,對於簡單的命令能夠應付過來,對於複雜的需要人機交互的任務就麻煩了。
其實我們可以使用一個更爲強大的實用程序screen。流行的Linux發行版(例如Red Hat Enterprise Linux 4)通常會自帶screen實用程序,如果沒有的話,可以從GNU screen的官方網站下載。
[root@tivf06 ~]# rpm -qa|grep screen xscreensaver-4.18-5.rhel4.11 screen-4.0.2-5
開始使用Screen
簡單來說,Screen是一個可以在多個進程之間多路複用一個物理終端的窗口管理器。Screen中有會話的概念,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。在screen中創建一個新的窗口有這樣幾種方式:
1.直接在命令行鍵入screen命令
[root@tivf06 ~]# screen
Screen將創建一個執行shell的全屏窗口。你可以執行任意shell程序,就像在ssh窗口中那樣。在該窗口中鍵入exit退出該窗口,如果這是該screen會話的唯一窗口,該screen會話退出,否則screen自動切換到前一個窗口。
2.Screen命令後跟你要執行的程序。
[root@tivf06 ~]# screen vi test.c
Screen創建一個執行vi test.c的單窗口會話,退出vi將退出該窗口/會話。
3.以上兩種方式都創建新的screen會話。我們還可以在一個已有screen會話中創建新的窗口。在當前screen窗口中鍵入C-a c ,即Ctrl鍵+a鍵,之後再按下c鍵,screen 在該會話內生成一個新的窗口並切換到該窗口。
screen還有更高級的功能。你可以不中斷screen窗口中程序的運行而暫時斷開(detach)screen會話,並在隨後時間重新連接(attach)該會話,重新控制各窗口中運行的程序。例如,我們打開一個screen窗口編輯/tmp/abc文件:
[root@tivf06 ~]# screen vi /tmp/abc
之後我們想暫時退出做點別的事情,比如出去散散步,那麼在screen窗口鍵入C-a d (直接斷開連接也可以的),Screen會給出detached提示:
暫時中斷會話 
半個小時之後回來了,找到該screen會話:
[root@tivf06 ~]# screen -ls There is a screen on:         16582.pts-1.tivf06      (Detached) 1 Socket in /tmp/screens/S-root.
重新連接會話:
[root@tivf06 ~]# screen -r 16582
看看出現什麼了,太棒了,一切都在。繼續幹吧。
你可能注意到給screen發送命令使用了特殊的鍵組合C-a。這是因爲我們在鍵盤上鍵入的信息是直接發送給當前screen窗口,必須用其他方式向screen窗口管理器發出命令,默認情況下,screen接收以C-a開始的命令。這種命令形式在screen中叫做鍵綁定(key binding),C-a叫做命令字符(command character)。
可以通過C-a ? 來查看所有的鍵綁定,常用的鍵綁定有:
C-a ? 顯示所有鍵綁定信息 
C-a w 顯示所有窗口列表 
C-a C-a 切換到之前顯示的窗口 
C-a c 創建一個新的運行shell的窗口並切換到該窗口 
C-a n 切換到下一個窗口 
C-a p 切換到前一個窗口(與C-a n相對) 
C-a 0..9 切換到窗口0..9 
C-a a 發送 C-a到當前窗口 
C-a d 暫時斷開screen會話 
C-a k 殺掉當前窗口 
C-a [ 進入拷貝/回滾模式
Screen常用選項
使用鍵綁定C-a ?命令可以看到, 默認的命令字符(Command key)爲C-a,轉義C-a(literal ^a)的字符爲a:
Screen 常用選項 
因爲screen把C-a看作是screen命令的開始,所以如果你想要screen窗口接收到C-a字符,就要輸入C-a a。Screen也允許你使用-e選項設置自己的命令字符和轉義字符,其格式爲:
-exy x爲命令字符,y爲轉義命令字符的字符
下面命令啓動的screen會話指定了命令字符爲C-t,轉義C-t的字符爲t,通過C-t ?命令可以看到該變化。
自定義命令字符和轉義字符 
[root@tivf18 root]# screen -e^tt
其他常用的命令選項有:
-c file 使用配置文件file,而不使用默認的$HOME/.screenrc 
-d|-D [pid.tty.host] 不開啓新的screen會話,而是斷開其他正在運行的screen會話 
-h num 指定歷史回滾緩衝區大小爲num行 
-list|-ls 列出現有screen會話,格式爲pid.tty.host 
-d -m 啓動一個開始就處於斷開模式的會話 
-r sessionowner/ [pid.tty.host] 重新連接一個斷開的會話。多用戶模式下連接到其他用戶screen會話需要指定sessionowner,需要setuid-root權限 
-S sessionname 創建screen會話時爲會話指定一個名字 
-v 顯示screen版本信息 
-wipe [match] 同-list,但刪掉那些無法連接的會話
下例顯示當前有兩個處於detached狀態的screen會話,你可以使用screen -r <screen_pid>重新連接上:
[root@tivf18 root]# screen -ls There are screens on:         8736.pts-1.tivf18       (Detached)         8462.pts-0.tivf18       (Detached) 2 Sockets in /root/.screen. [root@tivf18 root]# screen -r 8736
如果由於某種原因其中一個會話死掉了(例如人爲殺掉該會話),這時screen -list會顯示該會話爲dead狀態。使用screen -wipe命令清除該會話:
[root@tivf18 root]# kill -9 8462 [root@tivf18 root]# screen -ls   There are screens on:         8736.pts-1.tivf18       (Detached)         8462.pts-0.tivf18       (Dead ???) Remove dead screens with 'screen -wipe'. 2 Sockets in /root/.screen. [root@tivf18 root]# screen -wipe There are screens on:         8736.pts-1.tivf18       (Detached)         8462.pts-0.tivf18       (Removed) 1 socket wiped out. 1 Socket in /root/.screen. [root@tivf18 root]# screen -ls   There is a screen on:         8736.pts-1.tivf18       (Detached) 1 Socket in /root/.screen. [root@tivf18 root]#
-d -m 選項是一對很有意思的搭檔。他們啓動一個開始就處於斷開模式的會話。你可以在隨後需要的時候連接上該會話。有時候這是一個很有用的功能,比如我們可以使用它調試後臺程序。該選項一個更常用的搭配是:-dmS sessionname
啓動一個初始狀態斷開的screen會話:
[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test
連接該會話:
[root@tivf06 tianq]# screen -r mygdb
管理你的遠程會話
先來看看如何使用screen解決SIGHUP問題,比如現在我們要ftp傳輸一個大文件。如果按老的辦法,SSH登錄到系統,直接ftp命令開始傳輸,之後。。如果網絡速度還可以,恭喜你,不用等太長時間了;如果網絡不好,老老實實等着吧,只能傳輸完畢再斷開SSH連接了。讓我們使用screen 來試試。
SSH登錄到系統,在命令行鍵入screen。
[root@tivf18 root]# screen
在screen shell窗口中輸入ftp命令,登錄,開始傳輸。不願意等了?OK,在窗口中鍵入C-a d:
管理你的遠程會話 
然後。。退出SSH登錄?隨你怎樣,只要別殺掉screen會話。
是不是很方便?更進一步,其實我們可以利用screen這種功能來管理你的遠程會話,保存你所有的工作內容。你是不是每次登錄到系統都要開很多窗口,然後每天都要重複打開關閉這些窗口?讓screen來幫你"保存"吧,你只需要打開一個ssh窗口,創建需要的screen窗口,退出的時候C-a d"保存"你的工作,下次登錄後直接screen -r <screen_pid>就可以了。
最好能給每個窗口起一個名字,這樣好記些。使用C-a A給窗口起名字。使用C-a w可以看到這些窗口名字,可能名字出現的位置不同。使用putty:
putty 
使用telnet:
telnet 
更多Screen功能
Screen提供了豐富強大的定製功能。你可以在Screen的默認兩級配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如設定screen選項,定製綁定鍵,設定screen會話自啓動窗口,啓用多用戶模式,定製用戶訪問權限控制等等。如果你願意的話,也可以自己指定screen配置文件。
以多用戶功能爲例,screen默認是以單用戶模式運行的,你需要在配置文件中指定multiuser on 來打開多用戶模式,通過acl*(acladd,acldel,aclchg...)命令,你可以靈活配置其他用戶訪問你的screen會話。更多配置文件內容請參考screen的man頁。
-------------------------------------
實際應用中碰到的問題
[root@dev ~]# screen -ls 
There is a screen on: 
4083.down_video (Detached) 
1 Socket in /var/run/screen/S-root.
狀態顯示 down_video這個screen session已經被 斷開(detach)
此時我們用screen -r可以取回進行,
說明: -r :取回一個已被斷開的screen session
例: [root@dev ~]# screen -r down_video 
可以看到我們的程序仍在運行,中間未曾停止,而且此時我們又可以控制它了。

那麼如何中斷一個 screen session? 
看例子:
[root@dev ~]# screen -ls 
There is a screen on: 
4083.down_video (Attached) 
1 Socket in /var/run/screen/S-root.
請注意: 當前看到的session : down_video 正在被連接使用中, 
這時我想使用此session
[root@dev ~]# screen -r down_video 
There is a screen on: 
4083.down_video (Attached) 
There is no screen to be resumed matching down_video.
此時用 -r 不能取到此 screen session 
這時只能用 -d 參數來強制中斷它 
[root@dev ~]# screen -d down_video 
[4083.down_video detached.]
[root@dev ~]# screen -r down_video 
再用 -r 取回 screen就成功了

注意:原來的被我們中斷的連接會顯示 : 
[root@dev ~]# screen -r down_video 
[remote detached]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章