2016-03-12
精靈進(jìn)程
精靈進(jìn)程是生存期長(zhǎng)的一種進(jìn)程棺棵。它們常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng)挂据,在系統(tǒng)關(guān)閉時(shí)終止组贺。因?yàn)樗鼈儧](méi)有控制終端丸边,所以說(shuō)它們是在后臺(tái)運(yùn)行的叠必。unix系統(tǒng)有很多精靈進(jìn)程,它們執(zhí)行日常事務(wù)活動(dòng)妹窖。
精靈進(jìn)程的特征
syslogd精靈進(jìn)程可用于任何為操作人員記錄系統(tǒng)消息的程序中纬朝。可以在一臺(tái)實(shí)際的控制臺(tái)上打印這些消息骄呼,也可以將它們寫到一個(gè)文件中玄组。sendmail是標(biāo)準(zhǔn)郵遞精靈進(jìn)程。update程序定期將內(nèi)核緩存中的內(nèi)容寫到硬盤上谒麦。為了做到這一點(diǎn)俄讹,改程序每隔30秒調(diào)用sync函數(shù)一次。corn精靈進(jìn)程在指定的日期和時(shí)間執(zhí)行指定的命令绕德。許多系統(tǒng)管理任務(wù)是由corn定期地使相關(guān)程序執(zhí)行而得以實(shí)現(xiàn)患膛。inetd精靈進(jìn)程堅(jiān)挺系統(tǒng)的網(wǎng)絡(luò)界面,以輸入對(duì)各種網(wǎng)絡(luò)服務(wù)器的請(qǐng)求耻蛇。lpd進(jìn)程處理對(duì)系統(tǒng)提出的各個(gè)打印請(qǐng)求踪蹬。
所有的精靈進(jìn)程都以超級(jí)用戶的優(yōu)先權(quán)裕興。沒(méi)有一個(gè)精靈進(jìn)程具有控制終端臣咖。缺少控制終端可能呢是精靈進(jìn)程調(diào)用了setsid的結(jié)果跃捣。除update以外的所有精靈進(jìn)程都是進(jìn)程組的首進(jìn)程,對(duì)話期的首進(jìn)程夺蛇,而且是這些進(jìn)程組和對(duì)話期中的唯一進(jìn)程疚漆。update是它所在進(jìn)程組和對(duì)話期的唯一進(jìn)程,但是該進(jìn)程組的首進(jìn)程已終止。最后多有這些精靈進(jìn)程的父進(jìn)程都是init進(jìn)程娶聘。
編程規(guī)則
- 首先是fork闻镶,然后使父進(jìn)程exit。這樣做實(shí)現(xiàn)了:1丸升、如果該精靈進(jìn)程是由一條簡(jiǎn)單的shell命令啟動(dòng)的铆农,那么使父進(jìn)程終止使得shell認(rèn)為這條命令已經(jīng)執(zhí)行完成了。2狡耻、子進(jìn)程繼承了父進(jìn)程的進(jìn)程組id墩剖,但具有一個(gè)新的進(jìn)程id,這就保證了子進(jìn)程不是一個(gè)進(jìn)程組的首進(jìn)程。這對(duì)于下面就要做得setsid調(diào)用是必要的前提條件夷狰。
- 調(diào)用setsid以創(chuàng)建一個(gè)新的會(huì)話期岭皂。于是使調(diào)用進(jìn)程成為新的對(duì)話期的首進(jìn)程;成為一個(gè)新進(jìn)程組的首進(jìn)程孵淘;沒(méi)有控制終端蒲障。
- 將當(dāng)前工作目錄更改為根目錄歹篓。從父進(jìn)程集成過(guò)來(lái)的當(dāng)前工作目錄可能在一個(gè)裝配的文件系統(tǒng)中瘫证。因?yàn)榫`進(jìn)程通常在系統(tǒng)再引導(dǎo)之前是一直存在的,所以如果精靈進(jìn)程的當(dāng)前工作目錄在一個(gè)裝配文件系統(tǒng)中庄撮,那么該文件系統(tǒng)就不能被拆卸背捌。另外,某些精靈進(jìn)程可能會(huì)把當(dāng)前工作目錄更改到指定的位置洞斯,在此位置做他們的工作毡庆。
- 將文件方式創(chuàng)建屏蔽字設(shè)置為0.由繼承得來(lái)的文件方式創(chuàng)建屏蔽字可能會(huì)拒絕設(shè)置某些許可權(quán)。例如若精靈進(jìn)程要?jiǎng)?chuàng)建一個(gè)組可讀寫的文件烙如,而繼承的文件方式創(chuàng)建屏蔽字么抗,屏蔽了這兩種許可權(quán),則所要求的組可讀寫就不能起作用亚铁。
- 關(guān)閉不在需要的文件描述符蝇刀。這樣使精靈進(jìn)程就不在持有從父進(jìn)程繼承來(lái)的文件描述符。但是徘溢,究竟關(guān)閉那些描述符則與具體的精靈進(jìn)程有關(guān)吞琐。
出錯(cuò)記錄
因?yàn)榫`進(jìn)程沒(méi)有控制終端,所以其出錯(cuò)消息不能寫到標(biāo)準(zhǔn)出錯(cuò)輸出上然爆。在很多工作站上站粟,控制臺(tái)設(shè)備運(yùn)行一個(gè)窗口系統(tǒng),所以我們不希望所有精靈進(jìn)程都寫到控制臺(tái)設(shè)備上曾雕。我們也不希望每個(gè)精靈進(jìn)程將它的出錯(cuò)消息寫到一個(gè)單獨(dú)的文件中奴烙。對(duì)系統(tǒng)管理人員而言,如果要關(guān)心哪一個(gè)精靈進(jìn)程寫到哪一個(gè)記錄文件中,并定期檢查這些文件缸沃,那么一定會(huì)使他感到頭痛恰起。
SVR4流log驅(qū)動(dòng)程序
SCR4提供了一種流設(shè)備驅(qū)動(dòng)程序,其界面具有流出錯(cuò)記錄趾牧,流事件跟蹤以及控制臺(tái)記錄功能检盼。
有三個(gè)記錄進(jìn)程:出錯(cuò)記錄進(jìn)程、跟蹤記錄進(jìn)程以及控制臺(tái)記錄進(jìn)程翘单。每一條記錄消息可以送給其中之一吨枉。
產(chǎn)生記錄消息:
- 內(nèi)核中的歷程可以調(diào)用strlog以產(chǎn)生記錄消息。這種方法通常由流模塊和流設(shè)備驅(qū)動(dòng)程序用于出錯(cuò)消息或跟蹤消息哄芜。
- 一個(gè)用戶進(jìn)程(例如一個(gè)精靈進(jìn)程)可以用putmsg將消息送到/dev/log.這種消息可悲送到三個(gè)記錄進(jìn)程中的任意一個(gè)貌亭。
- 一個(gè)用戶進(jìn)程可以用write將消息寫到/dev/conslog。這種消息只能送像控制臺(tái)記錄進(jìn)程认臊。
讀記錄消息
- 標(biāo)準(zhǔn)的出錯(cuò)記錄是strerr圃庭。它將記錄消息增寫到在目錄/var/adm/stream下的一個(gè)文件中.該文件名是error.mm-dd srtrerr本身是個(gè)精靈進(jìn)程,通常在后臺(tái)運(yùn)行失晴,它將消息增寫到該文件中
- 標(biāo)準(zhǔn)的跟蹤記錄進(jìn)程是strace 它能有選擇地將一套指定的跟蹤消息寫至其標(biāo)準(zhǔn)輸出剧腻。
- 標(biāo)準(zhǔn)控制臺(tái)記錄進(jìn)程是syslogd,這是一個(gè)BSD導(dǎo)出程序涂屁。此進(jìn)程是個(gè)精靈進(jìn)程书在,它讀一個(gè)配置文件,然后將記錄消息寫至一個(gè)指定的文件或登錄用戶拆又,或?qū)⑾l(fā)送給另一臺(tái)主機(jī)上的syslog精靈進(jìn)程儒旬。
雖然上面沒(méi)有提及,但用戶也可以用自己的進(jìn)程替換任意一個(gè)系統(tǒng)提供的標(biāo)準(zhǔn)精靈進(jìn)程帖族。我們可以提供自己的出錯(cuò)記錄進(jìn)程栈源、跟蹤記錄進(jìn)程或控制臺(tái)記錄進(jìn)程。
每則log消息除消息本身外竖般,還包含有一些其他信息甚垦。例如,由log驅(qū)動(dòng)程序沿逆流方向發(fā)送的消息捻激,還包含下列消息:那個(gè)模塊產(chǎn)生的此消息 級(jí)別優(yōu)先級(jí) 某些標(biāo)準(zhǔn)及消息產(chǎn)生的時(shí)間制轰。如果使用putmsg產(chǎn)生一則log消息,則可以設(shè)置這些字段中的幾個(gè)胞谭。如果調(diào)用write將一則消息發(fā)送至控制臺(tái)記錄進(jìn)程垃杖,則只能發(fā)送消息字符串。
4.3+BSD syslog設(shè)施
自4.2BSD以來(lái)丈屹,廣泛地應(yīng)用了BSDsyslog設(shè)施调俘。大多數(shù)精靈進(jìn)程使用這一設(shè)施伶棒。
有三種方法產(chǎn)生記錄消息
- 內(nèi)核歷程可以調(diào)用log函數(shù)。任何一個(gè)用戶進(jìn)程通過(guò)打開(kāi)和讀/dev/klog設(shè)備就可以讀取這些消息彩库。
- 大多數(shù)用胡金成調(diào)用syslog函數(shù)以產(chǎn)生記錄消息肤无。這使消息發(fā)送至Unix域數(shù)據(jù)報(bào)套接口 /dev/log
- 在此主機(jī)上,或通過(guò)tcp/ip網(wǎng)絡(luò)連接到此主機(jī)的某一其他主機(jī)上的一個(gè)用戶進(jìn)程可將記錄消息發(fā)向udp端口514.
通常syslogd精靈進(jìn)程讀取三種格式的記錄消息骇钦。此精靈進(jìn)程在啟動(dòng)時(shí)讀一個(gè)配置文件宛渐。一般,其文件名為/etc.syslog.conf眯搭,該文件決定了不停累的消息應(yīng)送向何處窥翩。
該設(shè)施的界面是syslog函數(shù)
void openlog(char *ident, int option, int facility)
void syslog(int *priority, char *format, ...)
void closelog(void)
調(diào)用openlog是可選擇的。如果不調(diào)用openlog鳞仙,則在第一次調(diào)用syslog時(shí)寇蚊,自動(dòng)調(diào)用openlog。調(diào)用closelog也是可選擇的棍好,它只是關(guān)閉被用于與syslogd精靈進(jìn)程通信的描述符仗岸。
調(diào)用openlog使我們可以指定一個(gè)ident,以后此ident將被添加至每則記錄消息中。ident一般是程序的名稱借笙。option可以是
- LOG_CONS 若日志罅隙扒怖,不能通過(guò)Unix域數(shù)據(jù)報(bào)發(fā)送至syslogd,則將該消息寫至控制臺(tái)
- LOG_NDELAY1 立即打開(kāi)unix域數(shù)據(jù)報(bào)套借口至syslsgd精靈進(jìn)程提澎,不要等到記錄第一條消息姚垃。
- LOG_PERROR 除將日志消息發(fā)送給syslog外念链,還將它寫至標(biāo)準(zhǔn)出錯(cuò)盼忌。
- LOG_PID 每條消息都包含進(jìn)程id此選項(xiàng)可供對(duì)每個(gè)請(qǐng)求都fork一個(gè)子進(jìn)程的精靈進(jìn)程使用
openlog中facility是讓配置文件可以說(shuō)明,來(lái)自不同設(shè)施的消息以不同的方式進(jìn)行處理掂墓。如果不調(diào)用openlog或者以facility為0來(lái)調(diào)用它谦纱,那么在調(diào)用syslog時(shí),可以將facility作為priority參數(shù)的一個(gè)部分進(jìn)行說(shuō)明君编。
調(diào)用syslog產(chǎn)生一個(gè)消息記錄跨嘉。其prority參數(shù)是facility和level的組合,它們可選取的值分別列于facility和level中吃嘿。
format參數(shù)以及其他參數(shù)傳至vsprintf函數(shù)以便進(jìn)行格式化祠乃。在format中,每個(gè)%m都被戴漢成對(duì)應(yīng)于errno值得出錯(cuò)消息字符串(strerror)
facility參數(shù)
- LOG_AUTH 授權(quán)程序:login.su, getty,...
- LOG_CRON cron和at
- LOG_DRAEMON 系統(tǒng)精靈進(jìn)程:ftpd,routed
- LOG_KERN 內(nèi)核產(chǎn)生的消息
- LOG_LOCAL0 保留本地使用
- LOG_LOCAL1 保留本地使用
- LOG_LOCAL2 保留本地使用
- LOG_LOCAL3 保留本地使用
- LOG_LOCAL4 保留本地使用
- LOG_LOCAL5 保留本地使用
- LOG_LOCAL6 保留本地使用
- LOG_LOCAL7 保留本地使用
- LOG_LPR 行打系統(tǒng):lpd,lpc,...
- LOG_MAIL 郵件系統(tǒng)
- LOG_NEWS Usenet網(wǎng)絡(luò)新聞系統(tǒng)
- LOG_SYSLOG syslogd精靈進(jìn)程本身
- LOG_USER 來(lái)自其他用戶進(jìn)程的消息
- LOG_UUCP UUCP系統(tǒng)
syslog中的levels
- LOG_EMERG 緊急
- LOG_ALERT 必須立即修復(fù)的條件
- LOG_CRIT 臨界條件
- LOG_ERR 出錯(cuò)條件
- LOG_WARNING 警告條件
- LOG_NOTICE 正常但重要的條件
- LOG_INFO 信息性消息
- LOG_DEBUG 調(diào)試排錯(cuò)消息
客戶機(jī)-服務(wù)器模型
精靈進(jìn)程常常作為服務(wù)器進(jìn)程兑燥×链桑可以稱syslogd進(jìn)程為服務(wù)器,用戶進(jìn)程用unix域數(shù)據(jù)報(bào)套接口向其發(fā)送消息降瞳。
一般而言嘱支,服務(wù)器是一個(gè)進(jìn)程蚓胸,它等待客戶機(jī)與其聯(lián)系,提出某種類型的服務(wù)要求除师。