Daemon和正常執行的程序有什麼區別?
我一直在為基於 Linux 的嵌入式系統在 python 中實現各種服務。系統啟動後,有一個驅動程序服務需要永遠執行。它及時將其他服務作為子程序生成,並繼續循環這部分。我想要實現的主要目標是,除非系統關閉,否則此驅動程序服務不應停止。我有以下選擇:
- 使該服務成為系統守護程序並讓它持續執行
- 將該服務作為正常程序啟動並讓它持續執行
我應該採取哪個選項,為什麼?另外,這兩種方法的根本區別是什麼?
我將首先解決問題標題:守護程序和正常執行的程序之間的區別在於,大多數情況下,當您說“正常程序”時,您的意思是連接到使用者輸入/輸出 API 的東西,例如文本終端 (通常通過打開文件描述符表中的前 3 個文件描述符並連接到某種虛擬終端)或圖形使用者界面(在 Linux 和 UNIX 上通常使用 X11 協議)。另一方面,守護程序通常是指已與終端分離或從未連接到終端的程序。
至於問題本身,無論是作為守護程序執行還是作為“正常程序”執行時,應用程序都可能崩潰並需要重新啟動。當程序連接到某個使用者終端時,使用者可以檢測到故障並重新啟動應用程序,但守護程序通常不喜歡該功能 - 當守護程序與終端斷開連接時,檢測到程序崩潰了。
為了解決這個問題,我們發明了服務管理框架。有許多不同的實現,具有不同的特性:SysV、SystemD、Upstart、Supervisord、runit 等等。它們都有一個非常重要的特性:它們有一些方法可以啟動一個守護程序(通常在啟動時自動)監視它,直到它失敗,然後重新啟動它。
您是否應該使用服務管理框架來執行您的設備驅動程序服務?你絕對應該——這是唯一理智的方法。
使用哪種服務管理軟體,是一個比較困難的問題。通常,最好的選擇是使用您的作業系統捆綁的任何服務管理軟體——通常該軟體也作為程序 ID 0 執行並由核心直接啟動。目前,現代基於 Linux 的作業系統中最突出的此類軟體是 SystemD,它提供了許多功能,例如豐富的依賴管理語言、套接字啟動、計時器、網路和儲存管理等等。AFAIK,在嵌入式 Linux 作業系統中,這種情況並不常見,並且您的嵌入式系統可能使用經典的 SysV,它不太擅長重新啟動失敗的服務(或者通常根本不這樣做 - 它將該任務留給“服務腳本”,並且大多數實現不執行任何類型的重新啟動)。