開始概念之前首先上幾個實戰問答:
乙個服務的監測指令碼示例:
#!/bin/bash
export path=$path:/usr/local/bin
cmd=`/usr/sbin/lsof -n -p -i tcp -s tcp:listen | grep 8090`
if [ -z "$cmd" ]
then
echo 'down...' `date` >> /project/down.txt && cd /project && (npm run dev > /project/logs/server_log_`date +%y-%m-%d`.txt 2>&1 &)
else
echo 'up...' `date` >> /project/down.txt
fi
場景:如果我們需要乙個命令或者服務處於後台執行的狀態,什麼方法能最簡便的保證它在後台穩定執行呢?
如果們想要通過定時指令碼來檢測乙個服務的執行狀態並且在它掛掉的時候在後台重新啟動它呢?
解決方法
我們知道,當使用者登出(logout)或者網路斷開時,終端會收到 hup(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。
1. nohup
[root@pvcent107 ~]# nohup ping www.ibm.com &
[1] 3059
[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[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 grep www.ibm.com
[root@pvcent107 ~]#
值得注意的是,上例中我們的程序 id(pid)為31094,而它的父 id(ppid)為1(即為 init 程序 id),並不是當前終端的程序 id。請將此例與nohup 例中的父 id 做比較。
3. &
這裡還有乙個關於 subshell 的小技巧。我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中,從而擴充套件出很多有趣的功能,我們現在要討論的就是其中之一。
當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。讓我們來看看為什麼這樣就能躲過 hup 訊號的影響吧。
[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 grep www.ibm.com
[root@pvcent107 ~]#
從上例中可以看出,新提交的程序的父 id(ppid)為1(init 程序的 pid),並不是當前終端的程序 id。因此並不屬於當前終端的子程序,從而也就不會受到當前終端的 hup 訊號的影響了。
還有乙個常用的工具來實現這個功能: screen,詳情請參閱 linux screen 命令使用筆記
本文源鏈結 linux 技巧:讓程序在後台執行更可靠的幾種方法
Linux 技巧 讓程序在後台可靠執行的幾種方法
linux 技巧 讓程序在後台可靠執行的幾種方法 linux後台執行命令詳述 其中,f script 是所要提交的指令碼或命令。l 列出當前所有等待執行的作業。a t q命令具有相同的作用。r 清除作業。為了清除某個作業,還要提供相應的作業標識 i d 有些u n i x變體只接受a t r m作為...
Linux 技巧 讓程序在後台可靠執行的幾種方法
linux 技巧 讓程序在後台可靠執行的幾種方法 我們經常會碰到這樣的問題,用ssh登入了遠端的linux伺服器,執行了一些耗時較長的任務,結果卻由於網路等的不穩定導致任務中途失敗。這是由於在使用者登出 logout 或者網路斷開時,終端會收到 hup hangup 訊號從而關閉其所有子程序。解決辦...
Linux 技巧 讓程序在後台可靠執行的幾種方法
1.nohup ping www.ibm.com 2.setsid ping www.ibm.com 3.ping www.ibm.com 4.如果提交命令時未使用 將命令放入後台執行,可使用 ctrl z 和 bg 將其放入後台,再使用 disown disown h 1 nohup setsid...