來(lái)自于這篇文章:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/
- 首先我們?cè)诤笈_(tái)運(yùn)行一個(gè)任務(wù)
[root@training ~]# ping www.baidu.com >/dev/null 2>&1 &
[root@training ~]# ps -ef | grep ping
root 7699 7243 0 20:04 pts/1 00:00:00 ping www.baidu.com
root 7701 7243 0 20:05 pts/1 00:00:00 grep ping
[root@training ~]# ps -ef | grep 7243
root 7243 7239 0 19:59 pts/1 00:00:00 -bash
root 7699 7243 0 20:04 pts/1 00:00:00 ping www.baidu.com
root 7873 7243 0 20:07 pts/1 00:00:00 ps -ef
root 7874 7243 0 20:07 pts/1 00:00:00 grep 7243
[root@training ~]# ps -ef | grep 7239
root 7239 14432 0 19:59 ? 00:00:00 sshd: root@pts/1
root 7243 7239 0 19:59 pts/1 00:00:00 -bash
root 7914 7243 0 20:08 pts/1 00:00:00 grep 7239
[root@training ~]# ps -ef | grep 14432
root 7239 14432 0 19:59 ? 00:00:00 sshd: root@pts/1
root 8004 7243 0 20:08 pts/1 00:00:00 grep 14432
root 14432 1 0 Dec06 ? 00:00:00 /usr/sbin/sshd
[root@training ~]# ps -ef | grep init
root 1 0 0 Nov08 ? 00:00:00 /sbin/init
ping這個(gè)后臺(tái)進(jìn)程的PID是7699,其父進(jìn)程是7243
7243這個(gè)進(jìn)程是-bash鸟妙,其父進(jìn)程是7239
7239這個(gè)進(jìn)程是sshd: root@pts/1 听盖,其父進(jìn)程是14432
14432這個(gè)進(jìn)程是/usr/sbin/sshd卤妒,其父進(jìn)程是1
1這個(gè)進(jìn)程就是/sbin/init
通過(guò)pstree這個(gè)命令我們可以看得更清楚
init─┬─abrtd
├─acpid
├─agetty
├─sshd───sshd───bash─┬─ping
│ └─pstree
/sbin/init產(chǎn)生了/usr/sbin/sshd廷臼,
/usr/sbin/sshd產(chǎn)生了一個(gè)虛擬終端pts/1伞访,
pts/1給出了bash這個(gè)shell恩静,
然后我們?cè)赽ash上運(yùn)行ping這個(gè)進(jìn)程
當(dāng) ssh 斷開(kāi)連接時(shí)骤铃,HUP 信號(hào)自然會(huì)影響到它下面的所有子進(jìn)程(包括我們新建立的 ping 進(jìn)程)谆焊。
- 那么當(dāng)用戶(hù)注銷(xiāo)或者網(wǎng)絡(luò)斷開(kāi)的時(shí)候惠桃,終端會(huì)收到HUP(hangup信號(hào)),從而關(guān)閉所有子進(jìn)程辖试,
因此辜王,我們的解決辦法就有兩種途徑:要么讓進(jìn)程忽略 HUP 信號(hào),要么讓進(jìn)程運(yùn)行在新的會(huì)話里從而成為不屬于此終端的子進(jìn)程罐孝。
- 讓進(jìn)程忽略 HUP 信號(hào)
[root@training ~]# nohup ping www.baidu.com >/dev/null 2>&1 &
[root@training ~]# ps -ef | grep ping
root 10605 7243 0 20:45 pts/1 00:00:00 ping www.baidu.com
root 10616 7243 0 20:45 pts/1 00:00:00 grep ping
nohup能通過(guò)忽略 HUP 信號(hào)來(lái)使我們的進(jìn)程避免中途被中斷呐馆,這樣sshd被kill之后,ping變成孤兒進(jìn)程莲兢,就會(huì)被init收養(yǎng)摹恰,此時(shí)的pstree為
init─┬─abrtd
├─acpid
├─agetty
├─ping
├─sshd───sshd───bash───pstree
- 讓進(jìn)程運(yùn)行在新的會(huì)話里從而成為不屬于此終端的子進(jìn)程。
[root@training ~]# setsid ping www.baidu.com >/dev/null 2>&1 &
[root@training ~]# jobs
[1]+ Done setsid ping www.baidu.com > /dev/null 2>&1
[root@training ~]# ps -ef | grep ping
root 11061 1 0 20:51 ? 00:00:00 ping www.baidu.com
root 11103 7243 0 20:51 pts/1 00:00:00 grep ping
setsid之后馬上運(yùn)行jobs的話怒见,可以看到這個(gè)后臺(tái)進(jìn)程俗慈,但是再運(yùn)行jobs的話看不到任何進(jìn)程了。
- &
這里還有一個(gè)關(guān)于 subshell 的小技巧遣耍。我們知道闺阱,將一個(gè)或多個(gè)命名包含在“()”中就能讓這些命令在子 shell 中運(yùn)行中,從而擴(kuò)展出很多有趣的功能舵变。
[root@training ~]# (ping www.baidu.com >/dev/null 2>&1 &)
[root@training ~]# ps -ef | grep ping
root 11652 1 0 20:59 pts/1 00:00:00 ping www.baidu.com
root 11697 7243 0 20:59 pts/1 00:00:00 grep ping
當(dāng)我們將"&"也放入“()”內(nèi)之后酣溃,我們就會(huì)發(fā)現(xiàn)所提交的作業(yè)并不在作業(yè)列表中瘦穆,也就是說(shuō),是無(wú)法通過(guò)jobs來(lái)查看的赊豌。
從上例中可以看出扛或,新提交的進(jìn)程的父 ID(PPID)為1(init 進(jìn)程的 PID),并不是當(dāng)前終端的進(jìn)程 ID碘饼。
因此并不屬于當(dāng)前終端的子進(jìn)程熙兔,從而也就不會(huì)受到當(dāng)前終端的 HUP 信號(hào)的影響了。
- disown
disown 能幫助我們來(lái)事后補(bǔ)救當(dāng)前已經(jīng)在運(yùn)行了的作業(yè)艾恼,但是我并沒(méi)有找到disown的yum源住涉,在網(wǎng)上也沒(méi)找到……
這里要注意的是:
CTRL+z可以將當(dāng)前任務(wù)掛起,并放到后臺(tái)钠绍,此時(shí)處于stopped狀態(tài)舆声,
bg %n可以讓后臺(tái)stopped的進(jìn)程在后臺(tái)繼續(xù)進(jìn)行,變?yōu)閞unning柳爽,
fg %n可以將后臺(tái)的線程拿到前臺(tái)來(lái)執(zhí)行
- screen
screen是一個(gè)很強(qiáng)大的工具媳握,可以建立一個(gè)偽終端。
init─┬─abrtd
├─acpid
├─screen───bash───ping
├─sshd───sshd───bash───pstree
要注意的是:
在偽終端界面時(shí)磷脯,要通過(guò)CTRL+A+D來(lái)退出這個(gè)偽終端毙芜,回到原來(lái)的終端,參考這里:http://bg.artuion.com/linux/325.html