背景:工作需要纵竖,需要遠(yuǎn)程控制主機(jī)使其斷開Xshell后也能一直運(yùn)行。
關(guān)鍵字:& 杏愤,nohup靡砌,腳本掛起。
一珊楼,后臺(tái)運(yùn)行
在應(yīng)用Unix/Linux時(shí)通殃,我們一般想讓某個(gè)程序在后臺(tái)運(yùn)行,于是我們將常會(huì)用 & 在程序結(jié)尾來(lái)讓程序自動(dòng)運(yùn)行厕宗。
鍵入Ctrl + C邓了,發(fā)出SIGINT信號(hào),程序會(huì)繼續(xù)運(yùn)行
方法一媳瞪、輸入命令:jobs
1骗炉、輸入命令:jobs
終端顯示:
[1]+ Stopped vim /etc/network/interfaces > /home/leo/Desktop/ip.txt (wd: /)
輸入命令:KILL %1
2、輸入命令:jobs -l
終端顯示:
[1]+ 4664 停止 vim /etc/network/interfaces > /home/leo/Desktop/ip.txt (wd: /)
看到4664,這個(gè)就是PID了
輸入命令:kill 4664
終端沒(méi)有顯示蛇受。ok句葵。
方法二:輸入命令:ps
輸入命令:ps
顯示:
PID TTY TIME CMD
4664 pta/1 00:00:00 python
輸入: kill 4664
二,常用后臺(tái)命令
fg兢仰、bg乍丈、jobs、&把将、nohup轻专、ctrl+z、ctrl+c 命令
1.&
加在一個(gè)命令的最后察蹲,可以把這個(gè)命令放到后臺(tái)執(zhí)行请垛,如
watch -n 10 sh test.sh & #每10s在后臺(tái)執(zhí)行一次test.sh腳本
2.ctrl + z
可以將一個(gè)正在前臺(tái)執(zhí)行的命令放到后臺(tái)催训,并且處于暫停狀態(tài)。
3.jobs
查看當(dāng)前有多少在后臺(tái)運(yùn)行的命令
jobs -l選項(xiàng)可顯示所有任務(wù)的PID宗收,jobs的狀態(tài)可以是running, stopped, Terminated漫拭。但是如果任務(wù)被終止了(kill),shell 從當(dāng)前的shell環(huán)境已知的列表中刪除任務(wù)的進(jìn)程標(biāo)識(shí)混稽。
4.fg
將后臺(tái)中的命令調(diào)至前臺(tái)繼續(xù)運(yùn)行采驻。如果后臺(tái)中有多個(gè)命令,可以用fg %jobnumber(是命令編號(hào)匈勋,不是進(jìn)程號(hào))將選中的命令調(diào)出礼旅。
5.bg
將一個(gè)在后臺(tái)暫停的命令,變成在后臺(tái)繼續(xù)執(zhí)行洽洁。如果后臺(tái)中有多個(gè)命令各淀,可以用bg %jobnumber將選中的命令調(diào)出。
6.kill
法子1:通過(guò)jobs命令查看job號(hào)(假設(shè)為num)诡挂,然后執(zhí)行kill %num
法子2:通過(guò)ps命令查看job的進(jìn)程號(hào)(PID碎浇,假設(shè)為pid),然后執(zhí)行kill pid
前臺(tái)進(jìn)程的終止:Ctrl+c
7.nohup
如果讓程序始終在后臺(tái)執(zhí)行璃俗,即使關(guān)閉當(dāng)前的終端也執(zhí)行(之前的&做不到)奴璃,這時(shí)候需要nohup。該命令可以在你退出帳戶/關(guān)閉終端之后繼續(xù)運(yùn)行相應(yīng)的進(jìn)程城豁。
關(guān)閉中斷后苟穆,在另一個(gè)終端jobs已經(jīng)無(wú)法看到后臺(tái)跑得程序了,此時(shí)利用ps(進(jìn)程查看命令)
三唱星,斷開連接依然運(yùn)行
nohup python -u test.py > out.log 2>&1 &
nohup sh **.sh > /dev/null 2>&1 &
如上所示:
nohup 和 & 組合了后臺(tái)運(yùn)行程序雳旅。
可以輸出到 out.log保存程序輸出,也可以輸出到/dev/null 即空設(shè)備间聊,不保存輸出攒盈。
! ! ! 坑 ! ! !
nohup python test.py &
nohup python test.py 2>&1 &
nohup python test.py > test.out 2>&1 &
上面三種方式無(wú)論在nohup.out 或test.out都看不到數(shù)據(jù)結(jié)果,這是因?yàn)閜ython執(zhí)行有緩存輸出
解決
nohup python /test.py > nohup.log 2>&1 &
新的接口接入查看程序
ps -ef | grep python
四哎榴,對(duì)比&總結(jié)
使用&后臺(tái)運(yùn)行程序:
結(jié)果會(huì)輸出到終端
使用Ctrl + C發(fā)送SIGINT信號(hào)型豁,程序免疫
關(guān)閉session發(fā)送SIGHUP信號(hào),程序關(guān)閉
使用nohup運(yùn)行程序:
結(jié)果默認(rèn)會(huì)輸出到nohup.out
使用Ctrl + C發(fā)送SIGINT信號(hào)尚蝌,程序關(guān)閉
關(guān)閉session發(fā)送SIGHUP信號(hào)迎变,程序免疫
平日線上經(jīng)常使用nohup和&配合來(lái)啟動(dòng)程序:
同時(shí)免疫SIGINT和SIGHUP信號(hào)
同時(shí),還有一個(gè)最佳實(shí)踐:
不要將信息輸出到終端標(biāo)準(zhǔn)輸出飘言,標(biāo)準(zhǔn)錯(cuò)誤輸出衣形,而要用日志組件將信息記錄到日志里
nohup和&究竟有啥區(qū)別