一. nohup / setsid / &
使用場景:如果只是臨時有乙個命令需要長時間執行,什麼方法能最簡便的保證它在後台穩定執行呢?
我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。
解決方法:
1.nohup
只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"來將命令同時放入後台執行,也可用》filename 2>&1來更改預設的重定向檔名。
[root@pvcent107 ~]# nohup ping www.ibm.com &[1] 3059
to`nohup.
out'
[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
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 grep www.ibm.com
[root@pvcent107 ~]#
上例中我們的程序 id(pid)為31094,而它的父 id(ppid)為1(即為 init 程序 id),並不是當前終端的程序 id。請將此例與nohup 例中的父 id 做比較。
3. &
將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中 當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。
[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 訊號的影響了。
二. disown
使用場景:如果事先在命令前加上 nohup 或者 setsid 就可以避免 hup 訊號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 hup 訊號的影響呢?
解決方法:這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業排程和 disown 來解決這個問題了
當使用過 disown 之後,會將把目標作業從作業列表中移除,我們將不能再使用jobs來檢視它,但是依然能夠用ps -ef查詢到它。
disown 示例1(如果提交命令時已經用「&」將命令放入後台執行,則可以直接使用「disown」)
[root@pvcent107 build]# cp -r testlargefile largefile &[1] 4825
[root@pvcent107 build]# jobs
[1]+ running cp -i -r testlargefile largefile &
[root@pvcent107 build]# disown -h %1
[root@pvcent107 build]# ps -ef |grep largefile
root 4825 968 1 09:46 pts/4 00:00:00 cp -i -r testlargefile largefile
root 4853 968 0 09:46 pts/4 00:00:00 grep largefile
[root@pvcent107 build]# logout
disown 示例2(如果提交命令時未使用「&」將命令放入後台執行,可使用 ctrl-z 和「bg」將其放入後台,再使用「disown」)
[root@pvcent107 build]# cp -r testlargefile largefile2[1]+ stopped cp -i -r testlargefile largefile2
[root@pvcent107 build]# bg %1
[1]+ cp -i -r testlargefile largefile2 &
[root@pvcent107 build]# jobs
[1]+ running cp -i -r testlargefile largefile2 &
[root@pvcent107 build]# disown -h %1
[root@pvcent107 build]# ps -ef |grep largefile2
root 5790 5577 1 10:04 pts/3 00:00:00 cp -i -r testlargefile largefile2
root 5824 5577 0 10:05 pts/3 00:00:00 grep largefile2
[root@pvcent107 build]#
三: screen
使用場景: 我們已經知道了如何讓程序免受 hup 訊號的影響,但是如果有大量這種命令需要在穩定的後台裡執行,如何避免對每條命令都做這樣的操作呢?
解決方案: 此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ansi/vt100 的終端模擬器,使它能夠在乙個真實終端下執行多個全屏的偽終端。screen 的引數很多,具有很強大的功能,
screen例項
[root@pvcent107 ~]# screen -dms urumchi[root@pvcent107 ~]# screen -list
there is
a screen
on:
12842.urumchi (detached)
1 socket in
/tmp/screens/s-root.
[root@pvcent107 ~]# screen -r urumchi
當我們用「-r」連線到 screen 會話後,我們就可以在這個偽終端裡面為所欲為,再也不用擔心 hup 訊號會對我們的程序造成影響,也不用給每個命令前都加上「nohup」或者「setsid」了。
未使用 screen 時新程序的程序樹
[root@pvcent107 ~]# ping www.google.com &[1] 9499
[root@pvcent107 ~]# pstree -h 9499
init─┬─xvnc
├─acpid
├─atd
├─2*[sendmail]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash───ping
未使用 screen 時我們所處的 bash 是 sshd 的子程序,當 ssh 斷開連線時,hup 訊號自然會影響到它下面的所有子程序(包括我們新建立的 ping 程序)。
使用了 screen 後新程序的程序樹
[root@pvcent107 ~]# screen -r urumchi[root@pvcent107 ~]# ping www.ibm.com &
[1] 9488
[root@pvcent107 ~]# pstree -h 9488
init─┬─xvnc
├─acpid
├─atd
├─screen───bash───ping
├─2*[sendmail]
而使用了 screen 後就不同了,此時 bash 是 screen 的子程序,而 screen 是 init(pid為1)的子程序。那麼當 ssh 斷開連線時,hup 訊號自然不會影響到 screen 下面的子程序了。
Linux中如何讓程序在後台執行
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...
Linux中如何讓程序在後台執行
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...
Linux中 如何讓程序在後台中執行
在linux中,如果要讓程序再後台執行,一般情況下,我們再命令後面機上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在後台執行的命令,也可以重新放倒後台執行,首先按ctrl z暫停已經執行的程...