如何讓進(jìn)程在Linux后臺運(yùn)行
發(fā)布日期:2021-12-16 17:36 | 文章來源:源碼之家
在Linux中,如果要讓進(jìn)程在后臺運(yùn)行,一般情況下,我們在命令后面加上&即可,實(shí)際上,這樣是將命令放入到一個作業(yè)隊(duì)列中了:
$ ./test.sh &
[1] 17208 $ jobs -l
[1] 17208 Running ./test.sh & 對于已經(jīng)在前臺執(zhí)行的命令,也可以重新放到后臺執(zhí)行,首先按ctrl z暫停已經(jīng)運(yùn)行的進(jìn)程,然后使用bg命令將停止的作業(yè)放到后臺運(yùn)行: $ ./test.sh
[1] Stopped ./test.sh $ bg %1
[1] ./test.sh & $ jobs -l
[1] 22794 Running ./test.sh & 但是如上方到后臺執(zhí)行的進(jìn)程,其父進(jìn)程還是當(dāng)前終端shell的進(jìn)程,而一旦父進(jìn)程退出,則會發(fā)送hangup信號給所有子進(jìn)程,子進(jìn)程收到hangup以后也會退出。如果我們要在退出shell的時候繼續(xù)運(yùn)行進(jìn)程,則需要使用nohup忽略hangup信號,或者setsid將將父進(jìn)程設(shè)為init進(jìn)程(進(jìn)程號為1) $ echo $$
21734 $ nohup ./test.sh &
[1] 29016 $ ps -ef | grep test
515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
515 29713 21734 0 11:47 pts/12 00:00:00 grep test $ setsid ./test.sh &
[1] 409 $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 413 21734 0 11:49 pts/12 00:00:00 grep test 上面的試驗(yàn)演示了使用nohup/setsid加上&使進(jìn)程在后臺運(yùn)行,同時不受當(dāng)前shell退出的影響。那么對于已經(jīng)在后臺運(yùn)行的進(jìn)程,該怎么辦呢?可以使用disown命令: $ ./test.sh &
[1] 2539 $ jobs -l
[1] 2539 Running ./test.sh & $ disown -h %1 $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 2542 21734 0 11:52 pts/12 00:00:00 grep test 另外還有一種方法,即使將進(jìn)程在一個subshell中執(zhí)行,其實(shí)這和setsid異曲同工。方法很簡單,將命令用括號() 括起來即可: $ (./test.sh &) $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 12483 21734 0 11:59 pts/12 00:00:00 grep test 注:本文試驗(yàn)環(huán)境為Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell為/bin/bash,不同的OS和shell可能命令有些不一樣。例如AIX的ksh,沒有disown,但是可以使用nohup -p PID來獲得disown同樣的效果。 還有一種更加強(qiáng)大的方式是使用screen,首先創(chuàng)建一個斷開模式的虛擬終端,然后用-r選項(xiàng)重新連接這個虛擬終端,在其中執(zhí)行的任何命令,都能達(dá)到nohup的效果,這在有多個命令需要在后臺連續(xù)執(zhí)行的時候比較方便: $ screen -dmS screen_test $ screen -list
There is a screen on:
27963.screen_test (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng. $ screen -r screen_test
[1] 17208 $ jobs -l
[1] 17208 Running ./test.sh & 對于已經(jīng)在前臺執(zhí)行的命令,也可以重新放到后臺執(zhí)行,首先按ctrl z暫停已經(jīng)運(yùn)行的進(jìn)程,然后使用bg命令將停止的作業(yè)放到后臺運(yùn)行: $ ./test.sh
[1] Stopped ./test.sh $ bg %1
[1] ./test.sh & $ jobs -l
[1] 22794 Running ./test.sh & 但是如上方到后臺執(zhí)行的進(jìn)程,其父進(jìn)程還是當(dāng)前終端shell的進(jìn)程,而一旦父進(jìn)程退出,則會發(fā)送hangup信號給所有子進(jìn)程,子進(jìn)程收到hangup以后也會退出。如果我們要在退出shell的時候繼續(xù)運(yùn)行進(jìn)程,則需要使用nohup忽略hangup信號,或者setsid將將父進(jìn)程設(shè)為init進(jìn)程(進(jìn)程號為1) $ echo $$
21734 $ nohup ./test.sh &
[1] 29016 $ ps -ef | grep test
515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
515 29713 21734 0 11:47 pts/12 00:00:00 grep test $ setsid ./test.sh &
[1] 409 $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 413 21734 0 11:49 pts/12 00:00:00 grep test 上面的試驗(yàn)演示了使用nohup/setsid加上&使進(jìn)程在后臺運(yùn)行,同時不受當(dāng)前shell退出的影響。那么對于已經(jīng)在后臺運(yùn)行的進(jìn)程,該怎么辦呢?可以使用disown命令: $ ./test.sh &
[1] 2539 $ jobs -l
[1] 2539 Running ./test.sh & $ disown -h %1 $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 2542 21734 0 11:52 pts/12 00:00:00 grep test 另外還有一種方法,即使將進(jìn)程在一個subshell中執(zhí)行,其實(shí)這和setsid異曲同工。方法很簡單,將命令用括號() 括起來即可: $ (./test.sh &) $ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 12483 21734 0 11:59 pts/12 00:00:00 grep test 注:本文試驗(yàn)環(huán)境為Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell為/bin/bash,不同的OS和shell可能命令有些不一樣。例如AIX的ksh,沒有disown,但是可以使用nohup -p PID來獲得disown同樣的效果。 還有一種更加強(qiáng)大的方式是使用screen,首先創(chuàng)建一個斷開模式的虛擬終端,然后用-r選項(xiàng)重新連接這個虛擬終端,在其中執(zhí)行的任何命令,都能達(dá)到nohup的效果,這在有多個命令需要在后臺連續(xù)執(zhí)行的時候比較方便: $ screen -dmS screen_test $ screen -list
There is a screen on:
27963.screen_test (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng. $ screen -r screen_test
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章