我們經常會碰到這樣的問題,用 telnet/ssh 登入了遠端的 Linux 伺服器,運作了一些耗時較長的任務, 結果卻由于網絡的不穩定導緻任務中途失敗。如何讓指令送出後不受本地關閉終端視窗/網絡斷開連接配接的幹擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。
先介紹一下hangup 名稱的來由
在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當使用者 logout 時,modem 就會挂斷(hang up)電話。 同理,當 modem 斷開連接配接時,就會給終端發送 hangup 信号來通知其關閉所有子程序。
nohup/setsid/&
場景:
如果隻是臨時有一個指令需要長時間運作,什麼方法能最簡便的保證它在背景穩定運作呢?
解決方法:
我們知道,當使用者登出(logout)或者網絡斷開時,終端會收到 HUP(hangup)信号進而關閉其所有子程序。是以,我們的解決辦法就有兩種途徑:要麼讓程序忽略 HUP 信号,要麼讓程序運作在新的會話裡進而成為不屬于此終端的子程序。
1、nohup的使用
nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓送出的指令忽略 hangup 信号。
nohup 的使用是十分友善的,隻需在要處理的指令前加上 nohup 即可,标準輸出和标準錯誤預設會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"來将指令同時放入背景運作,也可用">filename 2>&1"來更改預設的重定向檔案名。
nohup 示例
nohup ping baidu.com &
2。setsid
nohup 無疑能通過忽略 HUP 信号來使我們的程序避免中途被中斷,但如果我們換個角度思考,如果我們的程序不屬于接受 HUP 信号的終端的子程序,那麼自然也就不會受到 HUP 信号的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助資訊
setsid 示例setsid ping baidu.com
screen
場景:
我們已經知道了如何讓程序免受 HUP 信号的影響,但是如果有大量這種指令需要在穩定的背景裡運作,如何避免對每條指令都做這樣的操作呢?
解決方法:
此時最友善的方法就是 screen 了。簡單的說,screen 提供了 ANSI/VT100 的終端模拟器,使它能夠在一個真實終端下運作多個全屏的僞終端。screen 的參數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什麼使用 screen 能夠避免 HUP 信号的影響。
使用 screen 很友善,有以下幾個常用選項:
screen -S yourname -> 建立一個叫yourname的session
screen -ls -> 列出目前所有的session
screen -r yourname -> 回到yourname這個session
screen -d yourname -> 遠端detach某個session
screen -d -r yourname -> 結束目前session并回到yourname這個session
Screen中止某個會話(session)
screen -S some_name -X quit
screen 示例
1.建立一個叫yourname的終端
screen -S newname
2.可運作要執行的指令
ping baidu.com
3.C-a d -> detach,暫時離開目前session,将目前的 screen session (可能含有多個 windows) 丢到背景執行,并會回到還沒進 screen 時的狀态,此時在 screen session 裡,每個 window 内運作的 process (無論是前台/背景)都在繼續執行,即使 logout 也不影響。
【java】 linux下利用nohup背景運作jar檔案包程式
Linux 運作jar包指令如下: 方式一: java -jar XXX.jar 特點:目前ssh視窗被鎖定,可按CTRL + C打斷程式運作,或直接關閉視窗,程式退出 那如何讓視窗不鎖定? 方式二 ...
linux nohup指令實作退出終端後程式繼續背景運作
Unix/Linux下一般想讓某個程式在背景運作,很多都是使用&在程式結尾來讓程式自動運作:但如果要想在退出終端後,程式依然還在背景運作,則要用nohup與&組合來實作. nohup ...
linux nohup指令使程式在背景運作的方法
在linux作業系統中從背景一直運作某個程式的方法,就是使用nohup指令了. Unix/Linux下一般比如想讓某個程式在背景運作,很多都是使用 & 在程式結尾來讓程式自動運作. 比如要運作 ...
Linux --- 程式背景運作的幾種方法
有時候我們運作一個程式,耗時比較長,是以在快下班的時候或是網絡不穩定的時候就比較抓狂. 今天分享幾個我在工作中用到的把程式放在背景運作的方法. nohup $ nohup --h Usage: noh ...
Linux下java nohup 背景運作關閉後程序停止的原因,不挂斷背景運作指令
Linux下java nohup 背景運作關閉後程序停止的原因,不挂斷背景運作指令 今天寫sh腳本發現一終止指令程式就停止運作了,檢查了很久才發現後面少了個&字元導緻的!錯誤寫法:nohup ...
Ubuntu中如何使得程式在背景運作
Ubuntu中如何使得程式在背景運作 一.前言 在Ubuntu中有的程式啟動需要執行改程式./bin目錄下的檔案,并且啟動之後這個shell就不能使用和關閉了,非常的麻煩,是以就有了相應的指令來解決這 ...
Linux scp 設定nohup背景運作
Linux scp 設定nohup背景運作 1.正常執行scp指令 2.輸入ctrl + z 暫停任務 3.bg将其放入背景 4.disown -h 将這個作業忽略HUP信号 5.測試會話中斷,任務繼 ...
iOS開發小技巧--iOS程式進入背景運作的實作
iOS程式進入背景運作的實作 視訊中看到老師用的iOS7,代碼中有開啟timer,無限請求資料的功能,但是切換到背景,代碼就不列印了 自己用的iOS9,進入背景還是可以列印的,再次進入前台也可以正常運 ...
在windows中:輕按兩下運作Python程式、背景運作Python程式
在windows中:輕按兩下運作Python程式.背景運作Python程式 安裝Python解釋器的windows環境,如果輕按兩下運作*.py的檔案,會閃退.怎樣避免閃退呢? 我們用python的日志輸出程 ...
随機推薦
python利用xmlrpc方式對odoo資料表進行增删改查操作
# -*- encoding: utf-8 -*- import xmlrpclib #導入xmlrpc庫,這個庫是python的标準庫. username ='admin' #使用者登入名 pwd = ...
面向對象設計SOLID五大原則
轉載自:碼農社群,http://w3croom.com/read.php?tid-4522.html 今天我給大家帶來的是面向對象設計SOLID五大原則的經典解說. 我們知道,面向對象對于 ...
servlet下載下傳,解決檔案名中有中文下載下傳路徑出現亂碼不能正常下載下傳問題
方法很多種,我隻試用了兩種. 首頁面JSP中引入下載下傳功能所需的js檔案.引入的時候設定編碼格式例如
以前用JAVAscript實作過令文本逐字輸出的效果,今天我來用html5中的canvas實作一下.canvas裡的内容可不像
那樣好操作,首先,你需要懂得一些html5的API才能操 ...
當 ReactJS 遇到 TypeScript
由于本人應用項目主要是2B的web應用程式, 是以以下暫不談react的服務端渲染和react navie, 先說說ReactJS: React 的元件化和 資料單向綁定 的模式(flux) 使應用 ...
iOS sourceTree忽略掉必要的xcuserdata檔案
1.找到git對應的檔案 git status 結果 會得到已經修改的檔案. modified: Zing.xcodeproj/xcuserdata/tiny.xcuserdatad/xcscheme ...
C#C/S架構示範 (MES系統)
之前做過一個MES系統,發一些裡面的截圖.如果有朋友也用這個架構.或者有興趣可以一起學習學習.使用開發工具VS2013,資料庫SqlServer2008和Oracle11C.插件dev15.2,開發模 ...
Mac編譯RocketMQ 4.1.0
參考:https://my.oschina.net/jayronwang/blog/861396 1. 前提先安裝并設定好maven,jdk,git,這個網上有很多教程,就不講了 2. 下載下傳rocke ...
Android通訊:通話
Android通訊之通話功能的實作: 在Android中,android.telephony.TelephonyManager對象是開發者擷取目前通話網絡相關資訊的視窗,通過TelephonyMana ...
主動觸發事件 自定義事件 trigger 及其用法
1. 觸發自定義事件方式 js.jq 2. jq 觸發 2.1 預設支援的事件 $('#h').on('click',function(){ $(this).append('
p< ...