linux程序後台執行的幾種方法

2021-06-12 00:01:14 字數 2697 閱讀 6450

我們經常會碰到這樣的問題,用 telnet/ssh 登入了遠端的 linux 伺服器,執行了一些耗時較長的任務, 結果卻由於網路的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端視窗/網路斷開連線的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。

nohup/setsid/&

場景:如果只是臨時有乙個命令需要長時間執行,什麼方法能最簡便的保證它在後台穩定執行呢?  hangup 名稱的來由在 unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當使用者 logout 時,modem 就會結束通話(hang up)**。 同理,當 modem 斷開連線時,就會給終端傳送 hangup 訊號來通知其關閉所有子程序。

解決方法:

我們知道,當使用者登出(logout)或者網路斷開時,終端會收到 hup(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。

1. nohup

nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 訊號。讓我們先來看一下 nohup 的幫助資訊:nohup(1) user commands nohup(1)

name nohup - run a command immune to hangups, with output to a non-tty

synopsis nohup command [arg]……

nohup option

description run command, ignoring hangup signals.

——help display this help and exit

——version output version information and exit

可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"來將命令同時放入後台執行,也可用">filename 2>&1"來更改預設的重定向檔名。

nohup 示例

[root@pvcent107 ~]# nohup ping www.ibm.com &

[root@pvcent107 ~]# ps -ef |grep 3059

root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.com root 3067 984 0 21:06 pts/3 00:00:00 grep 3059

[root@pvcent107 ~]#

2. setsid

nohup 無疑能通過忽略 hup 訊號來使我們的程序避免中途被中斷,但如果我們換個角度思考,如果我們的程序不屬於接受 hup 訊號的終端的子程序,那麼自然也就不會受到 hup 訊號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助資訊:setsid(8) linux programmer『s manual setsid(8)

name setsid - run a program in a new session

synopsis setsid program [ arg …… ]

description setsid runs a program in a new session.

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

setsid 示例

[root@pvcent107 ~]# setsid ping www.ibm.com

[root@pvcent107 ~]# ps -ef |grep www.ibm.com

root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com root 31102 29217 0 07:29 pts/4 00:00:00 grepwww.ibm.com

[root@pvcent107 ~]#

值得注意的是,上例中我們的程序 id(pid)為31094,而它的父 id(ppid)為1(即為 init 程序 id),並不是當前終端的程序 id.請將此例與nohup例中的父 id 做比較。

3. &

這裡還有乙個關於 subshell 的小技巧。我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中,從而擴充套件出很多有趣的功能,我們現在要討論的就是其中之一。

當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。讓我們來看看為什麼這樣就能躲過 hup 訊號的影響吧。

subshell 示例

[root@pvcent107 ~]# (ping www.ibm.com &)

[root@pvcent107 ~]# ps -ef |grep www.ibm.com

root 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.com root 16278 15362 0 14:13 pts/4 00:00:00 grepwww.ibm.com

[root@pvcent107 ~]#

從上例中可以看出,新提交的程序的父 id(ppid)為1(init 程序的 pid),並不是當前終端的程序 id.因此並不屬於當前終端的子程序,從而也就不會受到當前終端的 hup 訊號的影響了。

linux程序後台執行的幾種方式

在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 1 2 rsync.sh jobs 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程序,然後使用bg命令將停止的作業放到後台執行 bg 1,放...

Linux 程序後台執行的幾種方式(screen)

在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 rsync.sh jobs 但是如上方到後台執行的程序,其父程序還是當前終端shell的程序,而一旦父程序退出,則會傳送hangup訊號給所有子程序,子程序收到hangup以後也...

Linux 程序後台執行的幾種方式(screen)

在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 rsync.sh jobs 但是如上方到後台執行的程序,其父程序還是當前終端shell的程序,而一旦父程序退出,則會傳送hangup訊號給所有子程序,子程序收到hangup以後也...