我們經常會碰到這樣的問題,用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 示例
# nohup ping www.2cto.com &
[1] 3059 nohup:appending output to `nohup.out'
# ps -ef |grep 3059
root 3059 984 0 21:06 pts/3 00:00:00 ping www.2cto.com root 3067 984 0 21:06 pts/3 00:00:00
grep 3059
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 示例
# setsid ping www.2cto.com
# ps -ef |grep www.2cto.com
root 31094 1 0 07:28 ? 00:00:00 ping www.2cto.com root 31102 29217 0 07:29 pts/4 00:00:00
grep www.2cto.com
值得注意的是,上例中我們的程序id(pid)為31094, 而它的父id(ppid)為1(即為init 程序id),並不是當前終端的程序id.請將此例與nohup例中的父id 做比較。
3. &
這裡還有乙個關於subshell 的小技巧。我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子shell 中執行中,從而擴充套件出很多有趣的功能,我們現在要討論的就是其中之一。
當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。讓我們來看看為什麼這樣就能躲過hup 訊號的影響吧。
subshell 示例
# (ping www.2cto.com &)
# ps -ef |grep www.2cto.com root 16270 1 0 14:13 pts/4 00:00:00 ping www.2cto.com root 16278 15362 0 14:13 pts/4 00:00:00
grep www.2cto.com
從上例中可以看出, 新提交的程序的父id(ppid)為1(init 程序的pid),並不是當前終端的程序id。因此並不屬於當前終端的子程序,從而也就不會受到當前終端的hup訊號的影響了。
linux程序後台執行的幾種方式
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 1 2 rsync.sh jobs 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程序,然後使用bg命令將停止的作業放到後台執行 bg 1,放...
linux程序後台執行的幾種方法
我們經常會碰到這樣的問題,用 telnet ssh 登入了遠端的 linux 伺服器,執行了一些耗時較長的任務,結果卻由於網路的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端視窗 網路斷開連線的干擾呢?下面舉了一些例子,您可以針對不同的場景選擇不同的方式來處理這個問題。nohup sets...
Linux 程序後台執行的幾種方式(screen)
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 rsync.sh jobs 但是如上方到後台執行的程序,其父程序還是當前終端shell的程序,而一旦父程序退出,則會傳送hangup訊號給所有子程序,子程序收到hangup以後也...