Unix 讓進程安全地退出

来源:https://www.cnblogs.com/snaildev/archive/2018/01/22/8328635.html
-Advertisement-
Play Games

終止一個進程有很多方法(暫只說linux環境):前臺運行的進程,如果沒有提供退出功能,我們通常會Ctrl+C進行終止;後臺或守護進程,如果也沒有提供退出命令啥的,咱通常會kill掉;此外還有類似關機或重啟之類的特殊情況,也會導致進程終止。 無論哪種方法,最終都是通過向進程傳遞信號量的方式進行終止。只 ...


終止一個進程有很多方法(暫只說linux環境):前臺運行的進程,如果沒有提供退出功能,我們通常會Ctrl+C進行終止;後臺或守護進程,如果也沒有提供退出命令啥的,咱通常會kill掉;此外還有類似關機或重啟之類的特殊情況,也會導致進程終止。

無論哪種方法,最終都是通過向進程傳遞信號量的方式進行終止。只是不同的方式發送的信號也不同:比如Ctrl+C發送的是SIGINT,kill和killall發送的是SIGTERM,kill -9發送的是SIGKILL,等等。

 

有些信號可以在程式中捕獲,針對進行特殊處理;而有些則手動捕獲不了或不能忽略,只能服從命令。

對於那些可以捕獲到的終止類信號(如SIGTERM、SIGHUP、SIGINT等),就如同家長向正在玩仙劍的孩子說道:“玩兒一下午了,別玩了。”

如果碰到頑皮的,那麼很可能就當作耳邊風了——捕獲到信號後選擇不終止進程;

如果孩子還算聽話,那麼就趕緊把游戲存個檔退出了——捕獲到信號後做好收尾工作,然後終止進程(安全退出,推薦);

有的則圖省事直接退出——不捕獲信號或不做特殊處理,直接終止進程(大部分人都這麼做,不推薦);

如果碰到的是個嚴厲的家長,二話不說直接上前把游戲關掉,這下孩子傻眼了“我擦,還沒存檔!!!”——接收到了不可被忽略的終止信號

 

另外還有一點需要註意,針對關機和重啟的情況,是由操作系統按PID正序逐個發送SIGTERM,通知大家“做好準備,要關機了”,隨後(n秒後)會下最後通諜——SIGKILL。對於子進程來說,父進程由於PID小,會先收到SIGTERM,收到後會立即向子進程發SIGKILL結束子進程。這樣很可能會造成子進程接收不到操作系統發的SIGTERM,還未進行收尾工作就被終止。所以,還是儘量在主進程做收尾工作,或者主進程收到SIGTERM後主動向子進程發送SIGTERM(僅僅是這麼想的,未驗證 -.-)。

---------------------------------------------------分割線------------------------------------------------------------

附錄:

網上的一段示例代碼(Python)

#!/usr/bin/env python  
import time  
import signal  
import sys  
  
NEEDEXIT=False  
def SignalHandler(sig, id):  
    global NEEDEXIT  
    if sig == signal.SIGUSR1:  
        print 'received signal USR1'  
    elif sig == signal.SIGHUP:  
        print 'received signal HUP'  
    elif sig == signal.SIGTERM:  
        print 'received SIGTERM, shutting down'  
        NEEDEXIT = True  
  
signal.signal(signal.SIGUSR1, SignalHandler)  
signal.signal(signal.SIGHUP, SignalHandler)  
signal.signal(signal.SIGTERM, SignalHandler)  
  
while 1:  
    if NEEDEXIT:  
        sys.exit()  
    time.sleep(1)  

  


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

-Advertisement-
Play Games
更多相關文章
  • 最新下載地址:https://pan.baidu.com/s/1gg4zxaN, 具體參看官網MultiColorWin或者百度 搜索 關於這個軟體,後面只是功能修改,沒有必要再發表博客了 本軟體主要讓用戶能夠自定義文件夾和磁盤的樣式,直接上幾張圖 01、安裝界面 02 、軟體截圖 1、在個性化文件 ...
  • Writing queries Version:5.x 英文原文地址: "Writing queries" 將數據索引到了 Elasticsearch 之後,就可以準備搜索它們了。Elasticsearch 提供了一個強大的查詢 DSL ,使得用戶可以定義個性化的搜索邏輯。這個 DSL 是基於 JS ...
  • 1.關閉SELINUX功能1.1 修改配置文件,使關閉SELINUX永久生效sed 's#SELINUX=enforcing#SELINUX=disables#g' /etc/selinux/config >重啟系統生效1.2臨時關閉SELINUX[root@hadoop01 xningge]# s ...
  • 《一》線上查詢及幫助命令(2)1.man man [選項] [命令] 查看命令幫助,命令的詞典,更複雜的還有info,但不常用。 #man cd-a 顯示所有的手冊頁,不只是顯示第一個-f 只顯示命令的功能,而不顯示詳細的說明文件,跟whatis命令相同-w 不顯示手冊內容,只顯示將被格式化和顯示的 ...
  • 剛開始Linux預設的是動態獲取,而我們需要設置靜態IP(我是為了xshell的連接) 1. 執行dhclient命令自動獲取到一個IP,NETMASK, 2. 執行route命令,獲取default的GATEWAY 3.修改網路配置文件,下圖紅色框內為新修改的內容 4. 重啟網路 5. ping站 ...
  • tzselect 修改時區 select a timezone 時區顯示的是CET tzselect使用方法 這裡讓選擇大陸或大洋 很明顯選擇5 Asia(亞洲) 選擇國家 9 China 選在城市(難道新疆和北京不是一個時區嗎,好吧我選北京) 確認信息1, yes 2 no 重新選擇(我勒個擦,說 ...
  • mainWindow代碼如下(由於篇幅問題,子視窗代碼不貼出了,有需要源碼的可以留下郵箱): ~~~~ / Author : 博客園 Lance / include "mainwindow.h" include "ui_mainwindow.h" include include include in ...
  • 引言 在監控生產環境的服務的時候,通常需要對多個埠進行監控,如果我們手動一個一個的添加,這將是一件很麻煩的事情,為了減少這樣的情況,我們採用批量添加監控埠的方法,這是 非常常見的需求,zabbix也是支持這種方式的,需要使用zabbix的Discovery功能來實現,下麵小編就給大家分享一下批量 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...