1. 程式人生 > >讓java程式在後臺一直執行(例如putty關閉後後臺程式繼續執行)

讓java程式在後臺一直執行(例如putty關閉後後臺程式繼續執行)

在linux系統下如何使一個程式在後臺一直執行呢?很多人使用&結尾的命令形式,但是如果沒有守護程序的話,即使這樣,在終端關閉時程式也會終止執行。這時候就得使用nohup命令了。

     例如,如果在終端中執行java -jar xxx.jar&命令,當終端關閉時,xxx.jar也會同時結束執行,但是如果執行nohup java -jar xxx.jar&命令,則程式會在後臺一直執行,值得注意的是,此時程式控制臺輸出會被轉移到nohup.out檔案中。

附:nohup命令參考 nohup 命令   

用途:不掛斷地執行命令。   

語法:nohup Command [ Arg ... ] [ & ]   

描述:nohup 命令執行由 Command 引數和任何相關的 Arg 引數指定的命令,忽略所有結束通話(SIGHUP)訊號。在登出後使用 nohup 命令執行後臺中的程式。要執行後臺中的 nohup 命令,新增 & ( 表示"and"的符號)到命令的尾部。   

     無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。如果沒有檔案能建立或開啟以用於追加,那麼 Command 引數指定的命令不可呼叫。如果標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的檔案描述符。

如需要了解視窗關閉導致執行程序關閉的原因:請參看下面的具體分析

你是不是經常需要遠端登入到Linux伺服器?你是不是經常為一些長時間執行的任務頭疼?還在用 nohup 嗎?那麼來看看 screen 吧,它會給你一個驚喜! 你是不是經常需要 SSH 或者 telent 遠端登入到 Linux 伺服器?你是不是經常為一些長時間執行的任務而頭疼,比如系統備份、ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠端終端視窗,因為他們執行的時間太長了。必須等待它執行完畢,在此期間可不能關掉視窗或者斷開連線,否則這個任務就會被殺掉,一切半途而廢了。

【原因所在】

元凶:SIGHUP 訊號 讓我們來看看為什麼關掉視窗/斷開連線會使得正在執行的程式死掉。 在Linux/Unix中,有這樣幾個概念:

  • 程序組(process group):一個或多個程序的集合,每一個程序組有唯一一個程序組ID,即程序組長程序的ID。
  • 會話期(session):一個或多個程序組的集合,有唯一一個會話期首程序(session leader)。會話期ID為首程序的ID。
  • 會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連線的會話期首程序叫做控制程序(controlling process)。當前與終端互動的程序稱為前臺程序組。其餘程序組稱為後臺程序組。

根據POSIX.1定義: 結束通話訊號(SIGHUP)預設的動作是終止程式。 當終端介面檢測到網路連線斷開,將結束通話訊號傳送給控制程序(會話期首程序)。 如果會話期首程序終止,則該訊號傳送到該會話期前臺程序組

一個程序退出導致一個孤兒程序組中產生時,如果任意一個孤兒程序組程序處於STOP狀態,傳送SIGHUP和SIGCONT訊號到該程序組中所有程序。 因此當網路斷開或終端視窗關閉後,控制程序收到SIGHUP訊號退出,會導致該會話期內其他程序退出。 我們來看一個例子。開啟兩個SSH終端視窗,在其中一個執行top命令。 在另一個終端視窗,找到top的程序ID為5180,其父程序ID為5128,即登入shell。 使用pstree命令可以更清楚地看到這個關係: 使用ps-xj命令可以看到,登入shell(PID 5128)和top在同一個會話期,shell為會話期首程序,所在程序組PGID為5128,top所在程序組PGID為5180,為前臺程序組。 關閉第一個SSH視窗,在另一個視窗中可以看到top也被殺掉了。

(其實,對於windows控制檯程式,也是類似的。在一個控制檯視窗中執行一個非service程式,那麼控制檯視窗自然是該視窗中執行程式的父程序,當父程序關閉時,預設由其建立的子程序會被kill掉。當然,應該也有機制建立類似unix的後臺程序。。。)

【基礎迴避方法】    如果我們可以忽略SIGHUP訊號,關掉視窗應該就不會影響程式的運行了。nohup命令可以達到這個目的,如果程式的標準輸出/標準錯誤是終端,nohup預設將其重定向到nohup.out檔案。值得注意的是nohup命令只是使得程式忽略SIGHUP訊號,還需要使用標記 & 把它放在後臺執行。

【高階迴避方法】

   雖然nohup很容易使用,但還是比較"簡陋"的,對於簡單的命令能夠應付過來,對於複雜的需要人機互動的任務就麻煩了。 其實我們可以使用一個更為強大的實用程式screen。流行的Linux發行版(例如Red Hat Enterprise Linux 4)通常會自帶screen實用程式,如果沒有的話,可以從GNU screen的官方網站下載。

開始使用Screen
簡單來說,Screen是一個可以在多個程序之間多路複用一個物理終端的視窗管理器。Screen中有會話的概念,使用者可以在一個screen會話中建立多個screen視窗,在每一個screen視窗中就像操作一個真實的telnet/SSH連線視窗那樣。在screen中建立一個新的視窗有這樣幾種方式:
1.直接在命令列鍵入screen命令
Screen將建立一個執行shell的全屏視窗。你可以執行任意shell程式,就像在ssh視窗中那樣。在該視窗中鍵入exit退出該視窗,如果這是該screen會話的唯一視窗,該screen會話退出,否則screen自動切換到前一個視窗。
2.Screen命令後跟你要執行的程式。
Screen建立一個執行vi
test.c的單視窗會話,退出vi將退出該視窗/會話。
3.以上兩種方式都建立新的screen會話。我們還可以在一個已有screen會話中建立新的視窗。在當前screen視窗中鍵入C-a
c,即Ctrl鍵+a鍵,之後再按下c鍵,screen
在該會話內生成一個新的視窗並切換到該視窗。
screen還有更高階的功能。你可以不中斷screen視窗中程式的執行而暫時斷開(detach)screen會話,並在隨後時間重新連線(attach)該會話,重新控制各視窗中執行的程式。例如,我們開啟一個screen視窗編輯/tmp/abc檔案:
之後我們想暫時退出做點別的事情,比如出去散散步,那麼在screen視窗鍵入C-a
d,Screen會給出detached提示:

半個小時之後回來了,找到該screen會話:
重新連線會話:
看看出現什麼了,太棒了,一切都在。繼續幹吧。
你可能注意到給screen傳送命令使用了特殊的鍵組合C-a。這是因為我們在鍵盤上鍵入的資訊是直接傳送給當前screen視窗,必須用其他方式向screen視窗管理器發出命令,預設情況下,screen接收以C-a開始的命令。這種命令形式在screen中叫做鍵繫結(key
binding),C-a叫做命令字元(command character)。

使用時注意:

在當shell中提示了nohup成功後,還需要按終端上鍵盤任意鍵退回到shell輸入命令視窗,然後通過在shell中輸入exit來退出終端;如果在nohup執行成功後直接點關閉程式按鈕關閉終端的話,這時候會斷掉該命令所對應的session,導致nohup對應的程序被通知需要一起shutdown,起不到關掉終端後呼叫程式繼續後臺執行的作用。 比如輸入a enter 就可以回到shell了 不要通過ctrl+c來回到命令列

 使用 jobs 檢視任務。

相關推薦

java程式後臺一直執行例如putty關閉後臺程式繼續執行

在linux系統下如何使一個程式在後臺一直執行呢?很多人使用&結尾的命令形式,但是如果沒有守護程序的話,即使這樣,在終端關閉時程式也會終止執行。這時候就得使用nohup命令了。      例如,如果在終端中執行java -jar xxx.jar&命令,當終端

背水一戰 Windows 10 (118) - 後臺任務: 後臺下載任務任務分組,並行或串行執行,組完成通知

style 如何 abs bin html5 only emp void local [源碼下載] 背水一戰 Windows 10 (118) - 後臺任務: 後臺下載任務(任務分組,並行或串行執行,組完成後通知) 作者:webabcd介紹背水一戰 Windows 10

c語言五大記憶體分割槽-堆,棧,全域性/靜態儲存區,自由儲存區,程式碼區與可執行程式的三段-Text段,Date段,Bss段

一、c語言五大記憶體分割槽 棧區(stack):存放函式形參和區域性變數(auto型別),由編譯器自動分配和釋放 堆區(heap):該區由程式設計師申請後使用,需要手動釋放否則會造成記憶體洩漏。如果程式設計師沒有手動釋放,那麼程式結束時可能由OS回收。

[原創] HBuildX,微信小程式模擬器報錯如若已在管理後臺更新域名配置,請重新整理專案配置重新編譯專案

今天在學習使用uniapp,開發微信小程式時第三方登入時,HBuild編輯器報了一個錯誤,經過定位分析,確定程式碼是沒有問題的,報錯如下 如若已在管理後臺更新域名配置,請重新整理專案配置後重新編譯專案 經過在網上查詢資料,得到解決方法,只需修改HBuild配置即可 找到模擬器右上角的詳

spf13-vim 解決.vimrc.local中某些命令無法執行例如TAB設定

     spf13-vim是一個方便進行VIM IDE開發環境配置的非常優秀的開源工具,根據github上的說明可以方便的進行一鍵安裝點選開啟連結。本人也是在同事的推薦下進行了安裝。 ———————————————————————————分割線———

Java面向對象一封裝 繼承 多態 類 對象 方法

很好 new tex 子類重寫 概念 pan -- 3.1 復用 1.封裝:主要實現了隱藏細節,對用戶提供訪問接口,無需關心方法的具體實現。   如下,人這個類封裝了很多人的屬性和行為; 2.繼承:很好的實現了代碼的復用,提高了編程效率。 人{ 年齡(屬性一)

【轉】java日誌組件介紹common-logging,log4j,slf4j,logback

微秒 是把 輸出重定向 gin ons java 循環 框架 log4j.jar common-logging common-logging是apache提供的一個通用的日誌接口。用戶可以自由選擇第三方的日誌組件作為具體實現,像log4j,或者jdk自帶的lo

Java常見網絡操作URL類,InetAddress類,URLConnection類

雙向 部分 返回對象 至少 常用方法 連接 函數 ast 文件 *****************InetAddress********************** 對於InetAddress,三個方法:getLocalHost()、getByName()以及getA

java之Spring裝配Bean手動裝配、自動裝配、註解裝配

fault tran 常見 成員 如果 on() base 反轉 tor 在上一篇控制反轉中我們看到了依靠一個Bean文件來實現對代碼的控制,可謂十分便捷,再也不用去實例化對象了,2333~~~ 1.手動裝配 1 <bean id="todo" class="

Java I/O---RandomAccessFile類隨機訪問文件的讀取和寫入

通過 bubuko system 姓名 println and row param 指向 1.JDK API中RandomAccessFile類的描述 此類的實例支持對隨機訪問文件的讀取和寫入。隨機訪問文件的行為類似存儲在文件系統中的一個大

vue搭建後臺管理頁面點擊左側導航,切換右側內容

htm right 後臺 opd imp page con com ng- home.vue頁面 <template> <div style="background-color: #EBEBEB;min-height:900px">

Jquery等待ajax執行完畢繼續執行斷點調試正常,運行異常

.ajax cti cati 時間 utf 一個 ajax 發現 not 以前寫過一個程序,發現用斷點調試的時候,一步步的運行,程序是可以的,但是去了斷點程序就出現了問題。 $(document).ready(function(){ var arra=new A

java.net.SocketException: Permission denied將80埠重定向到8080埠

很多時候,tomcat是非root賬號,直接將8080改成80,tomcat會報錯 Java.NET.SocketException: Permission denied。原因是非root使用者不能訪問1024一下的埠。 為了解決這種問題,有方法如下:1.將當前使用者配置到sudo規則裡

JavaWeb專案練習--支付模組、後臺部分模組手風琴下拉選單、上傳技術

易寶支付 線上支付的兩種形式: 1. 電商與銀行直連! 安全 不收手續費 不與小電商合作! 2. 第三臺支付平臺 支付寶 易寶 財富通 好處: 不安全 收手續費(1%) 小電商可以與其合作! 需要在第三方註冊賬戶 需要認證! 我

C#實現軟體授權,限定MAC執行軟體license管理,簡單軟體註冊機制

最近做了一個綠色免安裝軟體,領導臨時要求加個註冊機制,不能讓現場工程師隨意複製。事出突然,只能在現場開發(離開現場軟體就不受我們控了)。花了不到兩個小時實現了簡單的註冊機制,稍作整理。 基本原理:1.軟體一執行就把計算機的CPU、主機板、BIOS、MAC地址記錄下來,然後加密(key=key1)生成

Java—單例設計模式餓漢單例,懶漢單例和多例設計模式

1.單例模式 定義:一個類只允許產生一個例項化物件。 a.物件如何產生? 通過類的構造方法 b.要想限制物件的產生? 通過構造方法限制,構造方法私有化,類外部無法產生例項化物件。 餓漢式單例:上來就new //餓漢式單例 class Singleton{

網頁裝進Android手機將html+css+js打包成Android應用簡單的

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java 自定義註解驗證 僅限於實體屬性值上的註解

資源下載地址:http://download.csdn.net/detail/weilai_zhilu/9761533   該驗證主要包含三部分 註解驗證類 註解處理方法類 實體類 測試類 第一部分:註解驗證類(此部分暫時只寫了三個驗證類) 下面

自開發程式加許可權控制SU21建立許可權物件、PFCG建立Role

自開發程式的許可權控制,需要先在SU21裡面建立新的許可權物件,把新的許可權物件給開發,讓開發在程式碼程式裡面加一段控制程式碼(建立、修改、顯示),再將這個建立好的許可權物件PFCG分配,或者不用建立新的許可權物件,直接用標準的許可權物件(比如一個自開發報表需要根據工廠去控制權限,直接把標準

java作業之數字魔方N維數字魔方和數字旋轉魔方

N維數字魔方 原理: 定義一個奇數階二維陣列,把每個元素順序填入不同的自然數,要求行列和對角線元素相加的結果相等。 效果圖: 實現程式碼: import java.util.*; public class MF{ public static void