Linux如何讓進(jìn)程在后臺(tái)運(yùn)行的三種方法詳解

我們經(jīng)常會(huì)碰到這樣的問(wèn)題,想要在linux 服務(wù)器運(yùn)行一些耗時(shí)較長(zhǎng)的任務(wù), 結(jié)果卻由于網(wǎng)絡(luò)的不穩(wěn)定導(dǎo)致任務(wù)中途失敗。如何讓命令提交后不受本地關(guān)閉終端窗口/網(wǎng)絡(luò)斷開(kāi)連接的干擾呢?

下面列舉了三種方法,可以很方便的滿足上述需求。

問(wèn)題分析:

我們知道,當(dāng)用戶注銷(logout)或者網(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)程。

三種解決辦法:

1. nohup

nohup 無(wú)疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號(hào)。

nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤缺省會(huì)被重定向到 nohup.out 文件中。一般我們可在結(jié)尾加上”&”來(lái)將命令同時(shí)放入后臺(tái)運(yùn)行,也可用”>linuxname 2>&1″來(lái)更改缺省的重定向文件名。

nohup 示例

[root@pythontab?~]#?nohup?ping?www.pythontab.com?&  [1]?3059  nohup:?appending?output?to?`nohup.out'  [root@pythontab?~]#?ps?-ef?|grep?3059  root??????3059???984??0?15:06?pts/3????00:00:00?ping?www.pythontab.com  root??????3067???984??0?15:06?pts/3????00:00:00?grep?3059  [root@pythontab?~]#

2。linuxsid

nohup 無(wú)疑能通過(guò)忽略 HUP 信號(hào)來(lái)使我們的進(jìn)程避免中途被中斷,但如果我們換個(gè)角度思考,如果我們的進(jìn)程不屬于接受 HUP 信號(hào)的終端的子進(jìn)程,那么自然也就不會(huì)受到 HUP 信號(hào)的影響了。setsid 就能幫助我們做到這一點(diǎn)。

setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。

setsid 示例

[root@pythontab?~]#?setsid?ping?www.pythontab.com  [root@pythontab?~]#?ps?-ef?|grep?www.pythontab.com  root?????31094?????1??0?07:28??????????00:00:00?ping?www.pythontab.com  root?????31102?29217??0?07:29?pts/4????00:00:00?grep?www.pythontab.com  [root@pythontab?~]#

值得注意的是,上例中我們的進(jìn)程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進(jìn)程 ID),并不是當(dāng)前終端的進(jìn)程 ID。

3。& subshell

這里還有一個(gè)關(guān)于 subshell 的小技巧。我們知道,將一個(gè)或多個(gè)命名包含在“()”中就能讓這些命令在子 shell 中運(yùn)行中,從而擴(kuò)展出很多有趣的功能,我們現(xiàn)在要討論的就是其中之一。

當(dāng)我們將”&”也放入“()”內(nèi)之后,我們就會(huì)發(fā)現(xiàn)所提交的linux并不在作業(yè)列表中,也就是說(shuō),是無(wú)法通過(guò)jobs來(lái)查看的。讓我們來(lái)看看為什么這樣就能躲過(guò) HUP 信號(hào)的影響吧。

subshell 示例

[root@pythontab?~]#?(ping?www.pythontab.com?&)  [root@pythontab?~]#?ps?-ef?|grep?www.pythontab.com  root?????16270?????1??0?16:13?pts/4????00:00:00?ping?www.pythontab.com  root?????16278?15362??0?16:13?pts/4????00:00:00?grep?www.pythontab.com  [root@pythontab?~]#

從上例中可以看出,新提交的進(jìn)程的父 ID(PPID)為1(init 進(jìn)程的 PID),并不是當(dāng)前終端的進(jìn)程 ID。因此并不屬于當(dāng)前終端的子進(jìn)程,從而也就不會(huì)受到當(dāng)前終端的 HUP 信號(hào)的影響了。

比較而言,我更喜歡用setsid,簡(jiǎn)單實(shí)用。當(dāng)然,這里看大家喜好即可,效果上差別不大。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享