Linux下使命令不受終端斷開的影響,保持在後臺運行的幾種方法及原理

来源:https://www.cnblogs.com/feiquan/archive/2019/08/19/11379291.html
-Advertisement-
Play Games

摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 摘自https://www.ibm.com/developerwor ...


摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

記錄一下Linux下使命令不受終端斷開的影響,保持在後臺運行的幾個方法及其原理。當用戶註銷logout或者網路中斷時,終端會受到HUP(hangup)信號從而關閉其所有子進程。因為解決方法大體有兩種:要麼讓進程忽略HUP信號,要麼讓進程運行在新的會話里從而成為不屬於此終端下的子進程。

1(本地單元測試通過)nohup命令可以讓要執行的命令忽略HUP信號,再加上&可以保證命令一直在後臺運行。

例:nohup commandXXX > test.log 2>&1 &

命令解析:

  • nohup可以讓commandXXX這個命令忽略HUP信號;
  • 第一個>代表將命令的標準輸出重定向到指定的地方,這裡是test.log
  • 2>&1代表重定向標準錯誤重定向到標準輸出,這裡標準輸出已經被重定向到test.log,所以標準錯誤也會輸出到test.log。這裡引申一下:

Linux中標準輸入即STDIN , 在/dev/stdin ,一般指鍵盤輸入, shell里代號是0;

Linux中標準輸出STDOUT, 在/dev/stdout,一般指終端(terminal), 就是顯示器, shell里代號是1;

Linux中標準錯誤STDERR,在/dev/stderr也是指終端(terminal),不同的是,錯誤信息送到這裡 shell里代號是2

  • 最後一個&表示讓命令在後臺運行
  • 關閉終端後可以通過ps -ef|grep commandXXX命令查找到後臺進程。

2(本地單元測試通過)setsid命令可以讓進行運行在新的會話下,即不屬於當前終端的子進程。那麼即使當前終端發出了HUP信號,也不會影響該進程。

例:setsid commandXXX

其實通過觀察進程中的父進程號(PPID)發現一些端倪,使用setsid後進行的PPID為1(即為init進程ID),並非當前終端的進程ID。

3(本地單元測試通過)將一個或多個命令用()括起來在shell中運行,所提交的作業並不在作業列表中,即無法通過jobs查看到。新提交的進程的PPID為1。

例:(commandXXX)

4(本地單元測試通過)若未加上述任何處理就執行了命令,如何補救才能讓其不受HUP信息的影響呢?答案是作業調度。對於某個已執行的命令,經過以下幾個步驟可以讓其忽略HUP信號:

  • 先使用ctrl+z命令將正在執行的命令變為job作業,; 
  • 使用jobs可以查看到具體的作業號(jobid);
  • 再用bg %jobid命令讓其在後臺運行;
  • 最後使用disown -h jobid 即可使該作業忽略HUP信號

5(未安裝此命令,暫未驗證)有大量這種需要穩定的在後臺運行的命令時,如何避免對每條命令都做上述的重覆操作呢?答案是screen。screen提供了ANSI/VT100的終端模擬器,能夠在一個真實終端下運行多個全屏的偽終端。screen具有很多參數,功能強大,在此僅簡要分析一下為什麼使用screen可以避免HUP信號的影響:

  • screen -dnS session new 建立一個處於斷開模式下的會話(並指定其會話名);
  • screen -list 列出所有會話;
  • screen -r session name 重新連接指定會話;
  • ctrl -a D暫時斷開當前會話;

當我們用-r連接到screen會話時,就進入了一個偽終端,不會再受到HUP信號的影響了。

其他命令:

  • pstree -H pid 查看進程號對應的進程命令的樹形結構
  • fg %jobid 將某個掛起的進程放回前臺
  • bg %jobid 將某個掛起的進程調到後臺繼續運行,這一點在調試代碼時尤其有用,因為將代碼編輯器掛起到後臺再重新返回時,游標定位仍停留到上次掛起時的位置,避免了重新地凝望的麻煩。
  • ctrl +c 止當前命令
  • jobs -l 列出所有任務的pid,jobs的狀態可以是running/stopped/terminated,但若任務終止了(kill),shell會從當前列表中刪除任務的進程標識。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 surging是基於.NET CORE 服務引擎。初始版本誕生於2017年6月份,經過NCC社區二年的孵化,2.0版本將在2019年08月28日進行發佈,經歷二年的發展,已經全部攘括了微服務架構的技術棧,覆蓋了從服務註冊、服務發現、中間件、協議主機再到鏈路跟蹤,並且制定了一套微服務的規則, ...
  • 開發環境:VS2012問題描述:一個簡單的WinForm視窗,一個群組控制項和一個Label,都是微軟雅黑12pxCAD2015下,看起來卻不一樣,一個明顯細得多。 CAD2014下,無此問題。實驗了CAD2007到CAD2018,有些版本有此問題,有些版本無次問題。原因:未知。 解決方法:改成宋體1 ...
  • 最近項目上遇到好幾個崩潰問題,解決過程有點曲折,在此記做個記錄。 項目背景介紹:該項目為語音識別實時分析系統,整套系統架構如下: 接連幾次崩潰的是中間的語音流接入系統,崩潰的情況如下: 1、打開文件過多報錯,導致系統直接卡死。 2、打開線程過多,導致系統直接崩潰。 3、Jetty容器非同步支持bug。 ...
  • bash通配符 ? # 表示一個任意字元 * # 表示0到無窮多個任意字元 [ ] # 表示一定有一個括弧內的字元,比如[abcd],表示一定有一個字元是a b 或者c [-] # -用來指定連續字元範圍,[-]表示一定有一個括弧內連續字元範圍內的字元,比如[a-z],表示一定有一個字元在a-z 範 ...
  • 轉載自yutiantongbu Windows 將FTP 映射到本地文件夾 簡化操作 1.右鍵我的電腦,選擇映射網路驅動器2.選擇"連接到可用與存儲文檔和圖片的網站"3.接下來下一步到 >輸入你的FTP路徑4.輸入用戶名,密碼5.完成後會在電腦的網路中顯示一個目錄。可以直接訪問了。 ©著作權 ...
  • 最近,筆者的筆記本卸載oracle資料庫,註冊表裡面刪除了不少相關信息,沒想到擔心的事情還是來了!桌面右鍵單擊顯示設置出現ms-settings:display或ms-settings:personalization-background,提示該文件沒有與之關聯的程式來執行該操作。我的天,修改不了桌 ...
  • 下麵學習Windows Server2008監控伺服器性能包括 日誌管理,歸檔日誌,日誌排錯,怎麼配置電腦以轉發和收集事件,使用任務管理監控記憶體和CPU的使用,查看程式記憶體使用,查看程式CPU使用,結束進程 ,查看登錄電腦的用戶。 1.在ADServer伺服器上面點擊開始菜單,選擇管理工具,打開 ...
  • 背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器 3. 使用工具:Source Insight 3.5, Visio 1. 介紹 在Linux OS中,Idle進程的運行會讓CPU進入cpuidle狀態。當沒有其他進程處於運行狀態時,Scheduler ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...