Linux 後臺執行命令:&和nohup

背景

當我們在終端或控制檯工作時,可能不希望由於運行一個作業而佔住了屏幕,因爲可能還有更重要的事情要做,比如閱讀電子郵件。對於密集訪問磁盤的進程,我們更希望它能夠在每天的非負荷高峯時間段運行(例如凌晨)。爲了使這些進程能夠在後臺運行,也就是說不在終端屏幕上運行,有幾種選擇方法可供使用。

&

當在前臺運行某個作業時,終端被該作業佔據;可以在命令後面加上& 實現後臺運行。
例如:sh test.sh &
適合在後臺運行的命令有find、費時的排序及一些shell腳本。在後臺運行作業時要當心:需要用戶交互的命令不要放在後臺執行,因爲這樣你的機器就會在那裏傻等。不過,作業在後臺運行一樣會將結果輸出到屏幕上,干擾你的工作。如果放在後臺運行的作業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個文件中:

command > out.file 2>&1 &

這樣,所有的標準輸出和錯誤輸出都將被重定向到一個叫做out.file 的文件中。

nohup

使用&命令後,作業被提交到後臺運行,當前控制檯沒有被佔用,但是一但把當前控制檯關掉(退出帳戶時),作業就會停止運行。nohup命令可以在你退出帳戶之後繼續運行相應的進程。nohup就是不掛起的意思( no hang up)。該命令的一般形式爲:

nohup command &

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

nohup command > myout.file 2>&1 &

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

kill進程

當你成功地提交進程以後,就會顯示出一個進程號,可以用它來監控該進程,或殺死它。(ps -ef | grep 進程號 或者 kill -9 進程號)
當要查找某個端口號被佔用的情況時,使用命令:

netstat -loap | grep "端口號"

即可找到佔用對應端口號的進程號,從而可以殺掉該進程。

案例

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

command >out.file 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結合就代表標準輸出了,就變成錯誤重定向到標準輸出。

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