linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
守護(hù)進(jìn)程是一種后臺(tái)運(yùn)行并且獨(dú)立于所有終端控制之外的進(jìn)程。
守護(hù)進(jìn)程的啟動(dòng)
要啟動(dòng)一個(gè)守護(hù)進(jìn)程,可以采取一下幾種方式:
- 在系統(tǒng)期間通過系統(tǒng)的初始化腳本啟動(dòng)守護(hù)進(jìn)程。這些腳本通常在目錄etc/rc.d下,通過它們所啟動(dòng)的守護(hù)進(jìn)程具有超級(jí)用戶的權(quán)限。系統(tǒng)的一些基本服務(wù)通常都是通過這種方式啟動(dòng)的。
- 很多網(wǎng)絡(luò)服務(wù)程序都是由inetd守護(hù)程序啟動(dòng)的。它監(jiān)聽各種網(wǎng)絡(luò)請(qǐng)求,如telnet、ftp等,在請(qǐng)求到達(dá)時(shí)啟動(dòng)相應(yīng)的服務(wù)器程序(telnet server,ftp server等)。
- 由cron定時(shí)啟動(dòng)的處理程序。這些程序在運(yùn)行時(shí)實(shí)際上也是一種守護(hù)進(jìn)程。
- 由at啟動(dòng)的處理程序。
- 守護(hù)程序也可以從終端啟動(dòng),通常這種方式只用于守護(hù)進(jìn)程的測(cè)試,或者是重啟因某種原因而停止的進(jìn)程。
- 在終端上用nohup啟動(dòng)的進(jìn)程。用這種方法可以把所有的程序都變成守護(hù)進(jìn)程。
守護(hù)進(jìn)程的建立
先來看一個(gè)守護(hù)進(jìn)程建立的例子:
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <syslog.h>
#define MAXFD 64
void daemon_init(const char* pname, int facility){
int i;
pit_t pid;
/*fork(),終止父進(jìn)程*/
if(pid=fork()){
exit(0);
}
/*第一子進(jìn)程*/
setsid();
signal(SIGHUP,SIG_IGN);
/*fork()終止第一子進(jìn)程*/
if(pid=fork())
exit(0);
/*第二子進(jìn)程*/
daemon_proc = 1;
/*將工作目錄設(shè)定位“/”*/
chdir("/");
/*清除文件掩碼*/
umask(0);
for(i = 0; i<MAXFD; i++){
close(i);
}
/*打開log*/
openlog(pname, LOG_PID, facility);
}
從上面的程序可以看出,建立一個(gè)守護(hù)進(jìn)程需要以下操作:
- fork。首先需要fork一個(gè)子進(jìn)程并將父進(jìn)程關(guān)閉。如果進(jìn)程是作為一個(gè)shell命令在命令行前臺(tái)啟動(dòng)的,當(dāng)父進(jìn)程終止時(shí),shell就認(rèn)為該命令已經(jīng)結(jié)束。這樣子進(jìn)程就自動(dòng)成為了后臺(tái)進(jìn)程。而且,子進(jìn)程從父進(jìn)程那里繼承了組標(biāo)識(shí)符同時(shí)又擁有了自己的進(jìn)程標(biāo)識(shí)符,這樣保證了子進(jìn)程不會(huì)是一個(gè)進(jìn)程組的首進(jìn)程。這一點(diǎn)是下一步setsid所必需的。
- setsid。setsid()調(diào)用創(chuàng)建了一個(gè)新的進(jìn)程組,調(diào)用進(jìn)程成為該進(jìn)程組的首進(jìn)程。這樣,就使該進(jìn)程脫離原來的終端,成為了獨(dú)立終端外的進(jìn)程。
- 忽略SIGHUP信號(hào),重新fork。這樣使進(jìn)程不再是進(jìn)程組的首進(jìn)程,可以防止在某些情況下進(jìn)程意外的打開終端而重新與終端發(fā)生聯(lián)系。
- 改變工作目錄,清楚文件掩碼。改變工作目錄主要是為了切斷進(jìn)程與原有文件系統(tǒng)的聯(lián)系。并且保證無論從什么地方啟動(dòng)進(jìn)程都能正常工作。清除文件掩碼是為了消除進(jìn)程自身掩碼對(duì)其創(chuàng)建文件的影響。
- 關(guān)閉全部已打開的文件句柄。這是為了防止子進(jìn)程繼承在父進(jìn)程中打開的文件而使這些文件始終保持打開從而產(chǎn)生某些沖突。
- 打開log系統(tǒng)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- linux shell實(shí)現(xiàn)守護(hù)進(jìn)程腳本
- php守護(hù)進(jìn)程 加linux命令nohup實(shí)現(xiàn)任務(wù)每秒執(zhí)行一次
- 詳解Linux中的守護(hù)進(jìn)程
- linux下如何創(chuàng)建守護(hù)進(jìn)程的步驟
- C語言編寫Linux守護(hù)進(jìn)程實(shí)例
- Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法
- Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程
- Linux守護(hù)進(jìn)程的啟動(dòng)方法
- linux下的守護(hù)進(jìn)程
- linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別
相關(guān)文章
linux上配置jdk時(shí),java命令提示沒有此文件或文件夾的解決方法
下面小編就為大家?guī)硪黄猯inux上配置jdk時(shí),java命令提示沒有此文件或文件夾的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Linux shell編程中IO和條件及循環(huán)處理的細(xì)節(jié)問題討論
這篇文章主要介紹了Linux shell編程中IO和條件及循環(huán)處理的細(xì)節(jié)問題討論,需要的朋友可以參考下2016-02-02
Linux?shell使用trap命令優(yōu)雅進(jìn)行處理程序中斷
這篇文章主要為大家詳細(xì)介紹了Linux?shell如何使用trap命令優(yōu)雅進(jìn)行處理程序中斷,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下2024-12-12
Shell腳本實(shí)現(xiàn)生成SSL自簽署證書
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)生成SSL自簽署證書,本文直接給出實(shí)現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下2015-01-01
詳解linux下利用crontab創(chuàng)建定時(shí)任務(wù)
這篇文章主要介紹了linux下利用crontab創(chuàng)建定時(shí)任務(wù)的相關(guān)資料,需要的朋友可以參考下2017-04-04
linux下定時(shí)執(zhí)行任務(wù)的方法及crontab 用法說明(收集整理)
這篇文章主要介紹了 linux下定時(shí)執(zhí)行任務(wù)的方法及crontab 用法說明(收集整理),需要的朋友可以參考下2017-04-04

