1. 程式人生 > >Linux 技巧:讓程序在後臺可靠執行的幾種方法

Linux 技巧:讓程序在後臺可靠執行的幾種方法

我們經常會碰到這樣的問題,用 telnet/ssh 登入了遠端的 Linux 伺服器,運行了一些耗時較長的任務, 結果卻由於網路的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端視窗/網路斷開連線的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。

nohup/setsid/&

場景:

如果只是臨時有一個命令需要長時間執行,什麼方法能最簡便的保證它在後臺穩定執行呢?

hangup 名稱的來由

在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會結束通話(hang up)電話。 同理,當 modem 斷開連線時,就會給終端傳送 hangup 訊號來通知其關閉所有子程序。

解決方法:

我們知道,當用戶登出(logout)或者網路斷開時,終端會收到 HUP(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 HUP 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。

1. nohup

nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 訊號。讓我們先來看一下 nohup 的幫助資訊:

12345678910111213141516NOHUP(1)                        User Commands                        NOHUP(1)
NAMEnohup - run a command immune to hangups, with output to a non-ttySYNOPSISnohup COMMAND [ARG]...nohup OPTIONDESCRIPTIONRun COMMAND, ignoring hangup signals.--help display this help and exit--versionoutput version information and exit

可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤預設會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"

來將命令同時放入後臺執行,也可用">filename 2>&1"來更改預設的重定向檔名。

nohup 示例
1234567[[email protected] ~]# nohup ping www.ibm.com &[1] 3059nohup: appending output to `nohup.out'[[email protected] ~]# ps -ef |grep 3059root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.comroot      3067   984  0 21:06 pts/3    00:00:00 grep 3059[[email protected] ~]#

2。setsid

nohup 無疑能通過忽略 HUP 訊號來使我們的程序避免中途被中斷,但如果我們換個角度思考,如果我們的程序不屬於接受 HUP 訊號的終端的子程序,那麼自然也就不會受到 HUP 訊號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助資訊:

12345678910SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)NAMEsetsid - run a program in a new sessionSYNOPSISsetsid program [ arg ... ]DESCRIPTIONsetsid runs a program in a new session.

可見 setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。

setsid 示例
12345[[email protected] ~]# setsid ping www.ibm.com[[email protected] ~]# ps -ef |grep www.ibm.comroot     31094     1  0 07:28 ?        00:00:00 ping www.ibm.comroot     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com[[email protected] ~]#

值得注意的是,上例中我們的程序 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 程序 ID),並不是當前終端的程序 ID。請將此例與nohup 例中的父 ID 做比較。

3。&

這裡還有一個關於 subshell 的小技巧。我們知道,將一個或多個命名包含在“()”中就能讓這些命令在子 shell 中執行中,從而擴展出很多有趣的功能,我們現在要討論的就是其中之一。

當我們將"&"也放入“()”內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。讓我們來看看為什麼這樣就能躲過 HUP 訊號的影響吧。

subshell 示例
12345[[email protected] ~]# (ping www.ibm.com &)[[email protected] ~]# ps -ef |grep www.ibm.comroot     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.comroot     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com[[email protected] ~]#

從上例中可以看出,新提交的程序的父 ID(PPID)為1(init 程序的 PID),並不是當前終端的程序 ID。因此並不屬於當前終端的子程序,從而也就不會受到當前終端的 HUP 訊號的影響了。

disown

場景:

我們已經知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 訊號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 HUP 訊號的影響呢?

解決方法:

這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業排程和 disown 來解決這個問題了。讓我們來看一下 disown 的幫助資訊:

1234567891011disown [-ar] [-h] [jobspec ...]Without options, each jobspec is  removed  from  the  table  ofactive  jobs.   If  the -h option is given, each jobspec is notremoved from the table, but is marked so  that  SIGHUP  is  notsent  to the job if the shell receives a SIGHUP.  If no jobspecis present, and neither the -a nor the -r option  is  supplied,the  current  job  is  used.  If no jobspec is supplied, the -aoption means to remove or mark all jobs; the -r option  withouta  jobspec  argument  restricts operation to running jobs.  Thereturn value is 0 unless a jobspec does  not  specify  a  validjob.

可以看出,我們可以用如下方式來達成我們的目的。

靈活運用 CTRL-z

在我們的日常工作中,我們可以用 CTRL-z 來將當前程序掛起到後臺暫停執行,執行一些別的操作,然後再用 fg 來將掛起的程序重新放回前臺(也可用 bg 來將掛起的程序放在後臺)繼續執行。這樣我們就可以在一個終端內靈活切換執行多個任務,這一點在除錯程式碼時尤為有用。因為將程式碼編輯器掛起到後臺再重新放回時,游標定位仍然停留在上次掛起時的位置,避免了重新定位的麻煩。

  • disown -h jobspec來使某個作業忽略HUP訊號。
  • disown -ah 來使所有的作業都忽略HUP訊號。
  • disown -rh 來使正在執行的作業忽略HUP訊號。

需要注意的是,當使用過 disown 之後,會將把目標作業從作業列表中移除,我們將不能再使用jobs來檢視它,但是依然能夠用ps -ef查詢到它。

但是還有一個問題,這種方法的操作物件是作業,如果我們在執行命令時在結尾加了"&"來使它成為一個作業並在後臺執行,那麼就萬事大吉了,我們可以通過jobs命令來得到所有作業的列表。但是如果並沒有把當前命令作為作業來執行,如何才能得到它的作業號呢?答案就是用 CTRL-z(按住Ctrl鍵的同時按住z鍵)了!

CTRL-z 的用途就是將當前程序掛起(Suspend),然後我們就可以用jobs命令來查詢它的作業號,再用bg jobspec來將它放入後臺並繼續執行。需要注意的是,如果掛起會影響當前程序的執行結果,請慎用此方法。

disown 示例1(如果提交命令時已經用“&”將命令放入後臺執行,則可以直接使用“disown”)
123456789[[email protected] build]# cp -r testLargeFile largeFile &[1] 4825[[email protected] build]# jobs[1]+  Running                 cp -i -r testLargeFile largeFile &[[email protected] build]# disown -h %1[[email protected] build]# ps -ef |grep largeFileroot      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testLargeFile largeFileroot      4853   968  0 09:46 pts/4    00:00:00 grep largeFile[[email protected] build]# logout
disown 示例2(如果提交命令時未使用“&”將命令放入後臺執行,可使用 CTRL-z 和“bg”將其放入後臺,再使用“disown”)
123456789101112[[email protected] build]# cp -r testLargeFile largeFile2[1]+  Stopped                 cp -i -r testLargeFile largeFile2[[email protected] build]# bg %1[1]+ cp -i -r testLargeFile largeFile2 &[[email protected] build]# jobs[1]+  Running                 cp -i -r testLargeFile largeFile2 &[[email protected] build]# disown -h %1[[email protected] build]# ps -ef |grep largeFile2root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testLargeFile largeFile2root      5824  5577  0 10:05 pts/3    00:00:00 grep largeFile2

相關推薦

Linux 技巧程序後臺可靠執行方法

我們經常會碰到這樣的問題,用 telnet/ssh 登入了遠端的 Linux 伺服器,運行了一些耗時較長的任務, 結果卻由於網路的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端視窗/網路斷開連線的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這

Linux 技巧程序後臺可靠執行方法&CentOS 7通過Firewall開放防火牆埠

一.讓程序在後臺可靠執行的幾種方法 方法1 #nohup  【命令】 & 例: [[email protected] ~]# nohup ping www.ibm.com & 方法2 # (【命令】 &) 例:  # (ping www.i

Linux 技巧進程在後臺可靠執行方法

stl 選項 con 中斷 program ng- dem 不同 正在 我們常常會碰到這種問題。用 telnet/ssh 登錄了遠程的 Linux server,執行了一些耗時較長的任務, 結果卻因為網絡的不穩定導致任務中途失敗。怎樣讓命令提交後不受本地關閉終端

避免後臺程序被殺死的方法

Android的幾種程序 前臺程序     即與使用者正在互動的Activity或者Activity用到的Service等,如果系統記憶體不足時前臺程序是最後被殺死的。 可見程序     可以是處於暫停狀態(onPause)的Activity或者繫結在其上的Service,

Linux查看磁盤io開銷的方法

磁盤io 系統性能分析怎樣才能快速的定位到並發高是由於磁盤io開銷大呢?可以通過三種方式:  第一種:用 top 命令 中的cpu 信息觀察  Top可以看到的cpu信息有:使用方法如下圖:  具體的解釋如下:  Tasks: 29 total 進程總數  1 running 正在運行的進程數  28 sl

Python爬蟲系列判斷目標網頁編碼的方法

qpi data- tps 分享 運行 ofo html nbsp 來看 在爬取網頁內容時,了解目標網站所用編碼是非常重要的,本文介紹幾種常用的方法,並使用幾個網站進行簡單測試。 代碼運行結果: 從不同國家的幾個網站測試結果來看,utf8使用的較多(對於純英文網站,用什

樹莓派linux系統中顯示隱藏文件的方法

模式 文件的 ctr style 方法 選項 可視化 終端 顯示 一、如果直接使用可視化文件管理器   1、直接點擊右鍵,直接選擇“顯示隱藏文件”選項。   2、快捷鍵 CTRL + H 二、在終端命令行模式下   可以使用ls命令的-a參數來顯示隱藏的文件及文件夾。

css盒子垂直水平居中的方法

方法1:寬度和高度已知的。 思路: 給父元素相對定位 給子元素絕對定位 left: 50%;top: 50%; margin-left: 負的寬度一半。 margin-top: 負的高度一半; <!DOCTYPE html> <html> <

Linux Ubuntu 下編譯Opencv c++專案的方法

Table of Contents 4.瞭解 1.使用g++命令列 pkg-config引數方法 新建一個cpp檔案:main.cpp,功能是輸入一幅影象檔案的路徑並顯示該影象: #include<opencv2/opencv.hpp>

學習筆記Android裡JSON解析的方法

一、解析方法:  Android解析json有很多種方法,下面介紹三種方法:Android自帶的org.json解析、Gson解析和Jackson解析。 優缺點對比:  Android自帶的方法有點像xml的dom解析,遍歷之後根據需要的key值去取資

程序後臺可靠執行方法

簡介: 想讓程序在斷開連線後依然保持執行?如果該程序已經開始運行了該如何補救? 如果有大量這類需求如何簡化操作? 我們經常會碰到這樣的問題,用 telnet/ssh 登入了遠端的 Linux 伺服器,運行了一些耗時較長的任務, 結果卻由於網路的不穩定導致任務中途失

linux在如何程序後臺執行

今天碰到這麼一個問題,使用ssh客戶端登陸了linux伺服器,啟動並執行服務之後如果關閉客戶端與伺服器的連線,這個時候運行於伺服器上的服務也會被關閉,如何讓命令提交之後不受本地關閉終端埠的影響呢? 首先我們要知道為啥客戶端的斷開會影響服務端程式的執行? 當用戶登出或

Linux 進程在後臺可靠運行的方法

lin post body nohup 所有 sid iso gpo 啟動 nohup 忽略 hang up 信號 setsid 使得父進程為1(init) & 使得父進程為1(init) disown 可以對已經啟動的進程進行忽略

Linux C語言pause()函式程序暫停直到訊號出現

C語言pause()函式:讓程序暫停直到訊號出現   相關函式:kill, signal, sleep 標頭檔案:#include <unistd.h> 定義函式:int

進程在後臺可靠運行的方法

讓進程在後臺可靠運行的幾種方法 nohup setsid & disown screen讓進程在後臺可靠運行的幾種方法說明:我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由於網絡的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終

nohup 進程在後臺可靠運行的方法

AR 列表 進程 opp ron bsp HA 環境 per 1. nohup nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號。 nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準

畫圖技巧 Matlab將資料傳送給Origin

神操作之Origin呼叫MATLAB Console 獲取資料畫圖 有時候使用Matlab進行了大量的計算工作,然後想要繪製一些資料圖形,感覺用Origin會更方便一些,於是想把這些資料直接傳送給Origin,但是怎麼傳呢? 使用OriginPro7.5,擁有Matlab Conso

linux 技巧使用 screen 管理遠端會話

當我們遠端連線伺服器系統時,當執行某個程式之後,關掉會話則程式也停止執行了,通過screen課解決這一問題。 步驟一: 安裝screen 步驟二: 輸入screen 再按任意鍵進入會話介面 步驟三: 關閉當前介面後,再次開啟新的會話,輸入screen -ls,會顯示出之前建立

Linux技巧如何利用Putty連線Linux主機

         隨著Linux在伺服器端應用的普及,Linux系統管理越來越依賴於遠端。在各種遠端登入工具中,Putty是出色的工具之一。    Putty是一個免費的、Windows 32平臺下的telnet、rlogin和ssh客戶端,但是功能絲毫不遜色於商業的teln

Linux環境下多程序和多執行緒的優缺點

多程序更穩定(一個執行緒掛掉整個程式掛,而一個程序掛掉不會影響其它程序)。 多執行緒更快捷(每個程序都要維護專屬的虛擬地址空間,而每個執行緒共享一個虛擬地址空間,因此從排程開銷方面考慮多執行緒佔優)。 ===================================