轉-Linux進程後臺運行的幾種方法

http://linux.ctocio.com.cn/179/12162679.shtml
咱們常常會碰到這樣的問題,用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.ibm.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.ibm.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.ibm.com
# 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
grep www.ibm.com
值得注意的是,上例中咱們的進程 ID(PID)爲31094, 而它的父ID(PPID)爲1(即爲init 進程ID),並非當前終端的進程ID.請將此例與nohup例中的父 ID 作比較。
3. &
這裏還有一個關於subshell 的小技巧。咱們知道,將一個或多個命名包含在「()」中就能讓這些命令在子 shell 中運行中,從而擴展出不少有趣的功能,咱們如今要討論的就是其中之一。
當咱們將"&"也放入「()」內以後,咱們就會發現所提交的做業並不在做業列表中,也就是說,是沒法經過jobs來查看的。讓咱們來看看爲何這樣就能躲過 HUP 信號的影響吧。
subshell 示例
# (ping www.ibm.com &)
# 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
grep www.ibm.com
從上例中能夠看出, 新提交的進程的父ID(PPID)爲1(init 進程的PID),並非當前終端的進程ID。所以並不屬於當前終端的子進程,從而也就不會受到當前終端的HUP信號的影響了。
相關文章
相關標籤/搜索