在linux中,守護進程也稱為“精靈進程”,是一個在後台運行且不受任何終端控制的特殊進程,用於執行特定的系統任務。守護程序獨立於控制終端並且週期性的執行某種發生的事件。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
守護程式的定義
守護程式也稱為精靈程式(Daemon),是一個在背景運作且不受任何終端控制的特殊進程,用於執行特定的系統任務。很多守護程式在系統引導的時候啟動,並且一直運行直到系統關閉。另一些只在需要的時候才啟動,完成任務後就會自動結束。
它獨立於控制終端並且週期性的執行某種發生的事件。守護程式是一種很有用的程式。 Linux的大多數伺服器就是用守護程式實現的。
Linux系統啟動時會啟動很多系統服務進程,這些系統服務進程沒有控制終端,不能直接和使用者互動。其他進程都是在使用者登入或執行程式時創建,在執行結束或使用者登出時終止,但係統服務進程(守護程式)不受使用者登入登出的影響,它們一直在運行。這種行程有一個名稱叫守護程式(Daemon)。
下面們用ps axj指令查看系統中的進程。參數a 表示不僅列出目前使用者的進程,也列出所有其他使用者的進程;參數x 表示不僅列出有控制終端的進程,也列出所有無控制終端的進程;參數j 表示列出與作業控制相關的資訊。
(1)凡是TPGID一欄寫著-1的都是沒有控制終端的進程,也就是守護程式;
(2)在COMMAND一列用[ ]括起來的名字表示內核線程,這些線程在內核裡創建,沒有用戶空間代碼,因此沒有程式文件名和命令行,通常採用以k開頭的名字,表示Kernel;
# (3)init進程我們已經很熟悉了,udevd負責維護/dev目錄下的設備文件,acpid負責電源管理,syslogd負責維護/var/log下的日誌文件;
(4)可以看出,守護程式通常會採用以d結尾的名字,表示Daemon。
守護程式的特性
(1)在Linux中,每個系統與使用者溝通的介面成為終端,每一個從此終端開始運作的程式都會依附於這個終端,這個終端被稱為這些進程的控制終端;
(2)當控制終端被關閉的時候,對應的進程會自動關閉。但是守護程序卻能突破這種限制,它脫離於終端並且在後台運行,(脫離終端的目的是為了避免進程在運行的過程中的信息在任何終端中顯示並且進程也不會被任何終端所產生的終端資訊所打斷),它從被執行的時候開始運轉,直到整個系統關閉才退出(當然可以認為是殺死相應的守護進程);
(3)如果想讓某個進程不因為使用者或中斷或其他變化而影響,那麼就必須把這個進程變成一個守護程式。
進程,進程組,會話,控制終端之間的關係
因為守護程式的建立需要改變這些環境參數,所以了解它們之間的關係很重要:
進程組:它是由一個或多個進程組成,進程組號(GID)就是這些進程中的進程組長的PID。
會話:其實叫做會話期(session),它包含了期間所有的行程群組,一般一個會話期開始於使用者login,一般login的是shell終端,所以shell終端又是此次會話期的首進程,會話一般結束於logout。對於非進程組長,它可以呼叫setsid()來建立一個新的會話。
控制終端(tty):一般就是指shell終端,它在會話期中可有也可以沒有。
建立守護程式
#建立守護程式最關鍵的一步是呼叫setsid函數建立一個新的Session Leader 。
#includepid_t setid(void);//该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。
注意,在呼叫這個函數之前,目前進程不允許是進程組的Leader,否則函數回傳-1。要確保目前進程不是進程組的Leader也很容易,只要先fork再呼叫setsid就行了。 fork創建的子進程和父進程在同一個進程組中,進程組的Leader必然是該組的第一個進程,所以子進程不可能是該組的第一個進程,在子進程中調用setsid就不會有問題了。
成功呼叫函數的結果是:
(1)建立一個新的Session,目前行程為Session Leader,目前流程的id就是Session的id;
(2)創建一個新的進程組,當前進程為進程組的Leader,當前進程的id就是進程組的id;
(3)如果當前進程原本有控制終端,則它失去這個終端,成為一個沒有控制終端的進程。 (所謂失去控制終端指的是,原來的控制終端仍然是打開的,仍然可以讀寫,但只是一個普通的打開文件,而不是控制終端了)。
如何殺死守護程式
1.首先ps axj | grep 守護程式名稱
,找到對應的守護進程,然後使用kill -9 守護程式名稱
殺掉;
2.利用ps -ef
指令找出對應的守護程式,再用kill -9
指令將其殺死;
3.建立shell腳本對進程的啟動、關閉、重新啟動進行自動管理。
相關推薦:《Linux影片教學》
以上是什麼是linux守護程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!