如果只是臨時有乙個命令需要長時間執行,需要最簡便的保證它在後台穩定執行:
我們知道,當使用者登出(logout)或者網路斷開時,終端會收到 hup(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。
1.nohup
nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 訊號。nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&「來將命令同時放入後台執行,也可用」>filename 2>&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
2.setid
nohup 無疑能通過忽略 hup 訊號來使我們的程序避免中途被中斷,但如果我們換個角度思考,如果我們的程序不屬於接受 hup 訊號的終端的子程序,那麼自然也就不會受到 hup 訊號的影響了。setsid 就能幫助我們做到這一點。 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
3.&
這裡還有乙個關於 subshell 的小技巧。我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中,從而擴充套件出很多有趣的功能,我們現在要討論的就是其中之一。
當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。
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 grep www.ibm.com
如果有大量命令需要在穩定的後台裡執行,此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ansi/vt100 的終端模擬器,使它能夠在乙個真實終端下執行多個全屏的偽終端。screen 的引數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什麼使用 screen 能夠避免 hup 訊號的影響。
使用 screen 很方便,有以下幾個常用選項:
screen 示例
[root@pvcent107 ~]
# screen -dms urumchi
[root@pvcent107 ~]
# screen -list
there is a screen on:
12842.urumchi (detached)
1 socket i
[root@pvcent107 ~]
# screen -r urumchi
當我們用「-r」連線到 screen 會話後,我們就可以在這個偽終端裡面為所欲為,再也不用擔心 hup 訊號會對我們的程序造成影響,也不用給每個命令前都加上「nohup」或者「setsid」了。
可以將乙個正在前台執行的命令放到後台,並且處於暫停狀態。
檢視當前有多少在後台執行的命令
jobs -l選項可顯示所有任務的pid,jobs的狀態可以是running, stopped, terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的程序標識。
將後台中的命令調至前台繼續執行。如果後台中有多個命令,可以用fg %jobnumber(是命令編號,不是程序號)將選中的命令調出。
將乙個在後台暫停的命令,變成在後台繼續執行。如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出。
法子1:通過jobs命令檢視job號(假設為num),然後執行kill %num
法子2:通過ps命令檢視job的程序號(pid,假設為pid),然後執行kill pid
前台程序的終止:ctrl+c
Linux 的程序掛起和恢復
程序的掛起及恢復 ctrl z 掛起,程式放到後台,程式沒有結束。jobs 檢視被掛起的程式工作號 恢復程序執行時,有兩種選擇 fg命令將掛起的作業放回到前台執行 用bg命令將掛起的作業放到後台執行 格式 fg 工作號 bg 工作號 程序 正在執行的乙個程式 程式 是一種寫好的 或指令碼 後台執行,...
Linux程序後台執行
學習snmp協議,寫了乙個用sysuptime.0獲取系統自開機到現在的時間的小php程式,如下 define bit 8 g 0 idd mysql connect localhost n1417 123456 or die could not connect mysql error mysql ...
程序在Linux後台執行
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...