詳解Linux中的守護進程
一、什么是守護進程
Linux系統(tǒng)啟動時會啟動很多系統(tǒng)服務進程,這些系統(tǒng)服 務進程沒有控制終端,不能直接和用戶交互。其它進程都是在用戶登錄或運行程序時創(chuàng)建,在運⾏結(jié)束或⽤戶注銷時終止,但系統(tǒng)服務進程不受用戶登錄注銷的影響,它們⼀直在運行著。這種進程叫守護進程。
守護進程也被稱為精靈進程,是運行在后臺的一種特殊進程,它獨立于控制終端并且周期性地執(zhí)行某種任務或等待處理某些發(fā)生的事件。
查看方式
ps axj命令:查看系統(tǒng)中的進程。
參數(shù)a表示不僅列當前⽤戶的進程,也列出所有其他用戶的進程;
參數(shù)x表示不僅列有控制終端的進程,也列出所有⽆控制終端的進程;
參數(shù)j表示列出與作業(yè)控制相關(guān)的信息;
二、守護進程的調(diào)用
創(chuàng)建守護進程最關(guān)鍵的⼀步是調(diào)⽤setsid函數(shù)創(chuàng)建⼀個新的會話,并成為會話leader。
該函數(shù)調(diào)用成功時返回新創(chuàng)建的Session的id(其實也就是當前進程的id),出錯返回-1。注意,調(diào)用這個函數(shù)之前,當前進程不允許是進程組的Leader,否則該函數(shù)返回-1。要保證當前進程不是進 程組的Leader也很容易,只要先fork再調(diào)⽤setsid就行了。fork創(chuàng)建的子進程和⽗進程在同⼀個進程組中,進程組的Leader必然是該組的第⼀個進程,所以子進程不可能是該組的第⼀進程,在子進程中調(diào)用setsid就不會有問題了。
成功創(chuàng)建并調(diào)用一個守護進程的標志是:
1、成功新建一個會話,當前進程成為該會話的leader,該會話的ID為當前進程的ID;
2、成功新建一個新的進程組,并且成為該組的組長,該進程組的組id即為當前進程的id;
3、如果當前進程有一個控制終端,那么當前進程失去這個控制終端,成為一個無控制終端的進程;所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是⼀個普通的打開⽂件⽽不是控制終端了。
三、守護進程的創(chuàng)建
1、使用umask將文件模式創(chuàng)建屏蔽字設置為0;
2、調(diào)用fork(),父進程退出(exit)。 (如果該守護進程作為一條簡單的shell命令啟動的,那么父進程終止使得shell認為該命令已經(jīng)執(zhí)行完畢。同時保證該進程不是一個進程組的組長進程)
3、調(diào)用setsid創(chuàng)建一個新會話。(setsid會使1、調(diào)用進程成為新會話的首進程;2、調(diào)用進程成為一個進程組的組長進程;3、調(diào)用進程沒有控制終端)
4、將當前工作目錄更改為根目錄;
5、關(guān)閉不再需要的文件描述符;
6、忽略SIGCHLD信號;
代碼實現(xiàn)mydemon:
除了自己實現(xiàn)外,我們還可以調(diào)用系統(tǒng)中的demon進行設置;
進行第二次fork的原因?
要明晰第二次fork的原因,就必須明晰這兩次fork的作用。
第一次fork的作用是:1、讓shell認為這條命令已經(jīng)終止,不用掛在終端輸入上;
2、為之后的setsid服務,因為調(diào)用setsid函數(shù)的進程不能是進程組組長,如果不fork出子進程,則此時的父進程是進程組組長,就無法調(diào)用setsid。(當子進程調(diào)用完setsid函數(shù)之后,子進程是會話組長也是進程組組長,并且脫離了控制終端,此時,不管控制終端如何操作,新的進程都不會收到一些信號使得進程退出。)
(2)第二次fork的作用:
雖然當前關(guān)閉了和終端的聯(lián)系,但是后期可能會誤操作打開了終端。只有確定會話首進程能打開終端設備,也就是再fork一次,再把父進程退出,再次fork的子進程作為守護進程繼續(xù)運行,保證了該精靈進程不是對話期的首進程。
第二次不是必須的,是可選的,市面上有些開源項目也是fork一次
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Centos7的apache網(wǎng)站環(huán)境搭建wordpress
本篇文章給大家詳細分析了在Centos7的apache網(wǎng)站環(huán)境搭建wordpress的詳細操作方法,有興趣的朋友參考下。2018-02-02詳解如何在CentOS7中使用Nginx和PHP7-FPM安裝Nextcloud
這篇文章主要介紹了詳解如何在CentOS7中使用Nginx和PHP7-FPM安裝Nextcloud,會通過 Nginx 和 PHP7-FPM 來運行 Nextcloud,同時使用 MariaDB 做為數(shù)據(jù)庫系統(tǒng)。2017-03-03Ubuntu安裝scrcpy完成手機投屏和控制(Ubuntu用QQ微信的另一種方法)
這篇文章主要介紹了Ubuntu安裝scrcpy手機投屏和控制(Ubuntu用QQ微信的另一種方法),這樣的話不用頻繁在鍵盤和手機間切換了 ,需要的朋友可以參考下2019-10-10