天天看點

Linux 背景執行指令:&和nohup

背景

當我們在終端或控制台工作時,可能不希望由于運作一個作業而占住了螢幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對于密集通路磁盤的程序,我們更希望它能夠在每天的非負荷高峰時間段運作(例如淩晨)。為了使這些程序能夠在背景運作,也就是說不在終端螢幕上運作,有幾種選擇方法可供使用。

&

當在前台運作某個作業時,終端被該作業占據;可以在指令後面加上& 實作背景運作。

例如:

sh test.sh &

适合在背景運作的指令有

find

、費時的排序及一些shell腳本。在背景運作作業時要當心:需要使用者互動的指令不要放在背景執行,因為這樣你的機器就會在那裡傻等。不過,作業在背景運作一樣會将結果輸出到螢幕上,幹擾你的工作。如果放在背景運作的作業會産生大量的輸出,最好使用下面的方法把它的輸出重定向到某個檔案中:

這樣,所有的标準輸出和錯誤輸出都将被重定向到一個叫做out.file 的檔案中。

nohup

使用&指令後,作業被送出到背景運作,目前控制台沒有被占用,但是一但把目前控制台關掉(退出帳戶時),作業就會停止運作。nohup指令可以在你退出帳戶之後繼續運作相應的程序。nohup就是不挂起的意思( no hang up)。該指令的一般形式為:

如果使用nohup指令送出作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的檔案中,除非另外指定了輸出檔案:

使用了nohup之後,很多人就這樣不管了,其實這樣有可能在目前賬戶非正常退出或者結束的時候,指令還是自己結束了。是以在使用nohup指令背景運作指令之後,需要使用exit正常退出目前賬戶,這樣才能保證指令一直在背景運作。

kill程序

當你成功地送出程序以後,就會顯示出一個程序号,可以用它來監控該程序,或殺死它。(ps -ef | grep 程序号 或者 kill -9 程序号)

當要查找某個端口号被占用的情況時,使用指令:

即可找到占用對應端口号的程序号,進而可以殺掉該程序。

案例

echo "start test_pack_processor"
nohup ./test_pack_processor &
sleep 10
ps -ef | grep "test_pack_processor" | grep -v 'grep' | awk '{print $2}' | xargs kill -SIGINT
# pidof test_pack_processor | xargs kill -SIGINT
           

在背景啟動test_pack_processor程序,在10s之後,找到該程序并向它發送ctrl+c指令。

其他指令解析

ctrl+z

可以将一個正在前台執行的指令放到背景,并且處于暫停狀态。

是以使用這個指令不能結束一個程序,相應的程序隻是暫停,但是依然占用端口号!

ctrl+c

終止前台指令。

也可以向背景程序發送該指令,表示結束該程序。

jobs

檢視目前有多少在背景運作的指令。

jobs -l選項可顯示所有任務的PID,jobs的狀态可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從目前的shell環境已知的清單中删除任務的程序辨別。

2>&1

1、command>out.file是将command的輸出重定向到out.file檔案,即輸出内容不列印到螢幕上,而是輸出到out.file檔案中。

2、2>&1 是将标準出錯重定向到标準輸出,這裡的标準輸出已經重定向到了out.file檔案,即将标準出錯也輸出到out.file檔案中。最後一個&, 是讓該指令在背景執行。

3、試想2>1代表什麼,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個檔案1,而不代表标準輸出;換成2>&1,&與1結合就代表标準輸出了,就變成錯誤重定向到标準輸出。

繼續閱讀