?
?
?
相關(guān)函數(shù)列表
//syslog函數(shù) #include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format,...); void closelog(void); int setlogmask(int maskpri); //除syslog,很多平臺(tái)還提供它的一種變體來(lái)處理可變參數(shù)列表 #include <syslog.h> #include <stdarg.h> void vsyslog(int priority, const char *format, va_list arg);
?
?
ps -efj
結(jié)構(gòu)如下
UID PID PPID PGID SID C STIME TTY TIME CMD root 1 0 1 1 0 Aug07 ? 00:00:01 /sbin/init root 2 0 0 0 0 Aug07 ? 00:00:00 [kthreadd] root 3 2 0 0 0 Aug07 ? 00:00:00 [migration/0] root 4 2 0 0 0 Aug07 ? 00:00:02 [ksoftirqd/0] root 5 2 0 0 0 Aug07 ? 00:00:00 [migration/0] root 6 2 0 0 0 Aug07 ? 00:00:10 [watchdog/0] root 7 2 0 0 0 Aug07 ? 00:03:41 [events/0] root 8 2 0 0 0 Aug07 ? 00:00:00 [cgroup] root 9 2 0 0 0 Aug07 ? 00:00:00 [khelper] root 10 2 0 0 0 Aug07 ? 00:00:00 [netns] root 11 2 0 0 0 Aug07 ? 00:00:00 [async/mgr] root 12 2 0 0 0 Aug07 ? 00:00:00 [pm] root 13 2 0 0 0 Aug07 ? 00:00:18 [sync_supers] root 14 2 0 0 0 Aug07 ? 00:00:20 [bdi-default] root 15 2 0 0 0 Aug07 ? 00:00:00 [kintegrityd/0] root 16 2 0 0 0 Aug07 ? 00:00:01 [kblockd/0] root 17 2 0 0 0 Aug07 ? 00:00:00 [kacpid] root 18 2 0 0 0 Aug07 ? 00:00:00 [kacpi_notify] root 19 2 0 0 0 Aug07 ? 00:00:00 [kacpi_hotplug] root 20 2 0 0 0 Aug07 ? 00:00:00 [ata/0] root 21 2 0 0 0 Aug07 ? 00:00:00 [ata_aux] root 22 2 0 0 0 Aug07 ? 00:00:00 [ksuspend_usbd] root 23 2 0 0 0 Aug07 ? 00:00:00 [khubd] root 24 2 0 0 0 Aug07 ? 00:00:00 [kseriod] root 25 2 0 0 0 Aug07 ? 00:00:00 [md/0] root 26 2 0 0 0 Aug07 ? 00:00:00 [md_misc/0] root 27 2 0 0 0 Aug07 ? 00:00:01 [khungtaskd] root 28 2 0 0 0 Aug07 ? 00:00:00 [kswapd0] root 29 2 0 0 0 Aug07 ? 00:00:00 [ksmd] root 30 2 0 0 0 Aug07 ? 00:00:00 [khugepaged] root 31 2 0 0 0 Aug07 ? 00:00:00 [aio/0] root 32 2 0 0 0 Aug07 ? 00:00:00 [crypto/0] root 37 2 0 0 0 Aug07 ? 00:00:00 [kthrotld/0] root 39 2 0 0 0 Aug07 ? 00:00:00 [kpsmoused] root 40 2 0 0 0 Aug07 ? 00:00:00 [usbhid_resumer] root 70 2 0 0 0 Aug07 ? 00:00:00 [kstriped] root 275 2 0 0 0 Aug07 ? 00:00:00 [scsi_eh_0] root 276 2 0 0 0 Aug07 ? 00:00:00 [scsi_eh_1] root 359 2 0 0 0 Aug07 ? 00:00:00 [virtio-blk] root 380 2 0 0 0 Aug07 ? 00:00:00 [jbd2/vda1-8] root 381 2 0 0 0 Aug07 ? 00:00:00 [ext4-dio-unwrit] root 430 2 0 0 0 Aug07 ? 00:00:00 [kauditd] root 709 2 0 0 0 Aug07 ? 00:00:00 [virtio-net] root 839 2 0 0 0 Aug07 ? 00:00:00 [vballoon] root 906 2 0 0 0 Aug07 ? 00:00:00 [kjournald]
以上分別是用戶ID,進(jìn)程ID,父進(jìn)程ID,進(jìn)程組ID,會(huì)話ID,終端名稱以及命令字符串
?
?
Linux中的守護(hù)進(jìn)程
1.kswapd守護(hù)進(jìn)程也稱為內(nèi)存換頁(yè)守護(hù)進(jìn)程。它支持虛擬內(nèi)存子系統(tǒng)在經(jīng)過(guò)一段時(shí)間后將臟頁(yè)面慢慢的寫(xiě)會(huì)
? ?磁盤(pán)來(lái)回收這些頁(yè)面
2.flush守護(hù)進(jìn)程再可用內(nèi)存達(dá)到設(shè)置的最小閥值時(shí)將臟頁(yè)面刷新到磁盤(pán)。它也定期的將臟頁(yè)面刷新回磁盤(pán)來(lái)
? ?減少在系統(tǒng)出現(xiàn)故障時(shí)發(fā)生的數(shù)據(jù)丟失。多個(gè)刷新守護(hù)進(jìn)程可以同時(shí)存在,每個(gè)寫(xiě)回設(shè)備都有一個(gè)刷新守護(hù)
? ?進(jìn)程。輸出實(shí)例中顯示一個(gè)名為flush-8:0的刷新守護(hù)進(jìn)程。從名字可以看出,寫(xiě)回設(shè)備室通過(guò)主設(shè)備號(hào)(8)和
? ?副設(shè)備號(hào)(0)來(lái)識(shí)別的
3.sync_supers守護(hù)進(jìn)程定期將文件系統(tǒng)刷新到磁盤(pán)
4.jbd守護(hù)進(jìn)程幫助實(shí)現(xiàn)了ext4文件系統(tǒng)中的日志功能
5.rpcbind守護(hù)進(jìn)程提供將遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call RPC)程序號(hào)映射為網(wǎng)絡(luò)端口號(hào)的服務(wù)。
? ?syslogd守護(hù)進(jìn)程可以被由管理員啟動(dòng)的將系統(tǒng)消息記入日志的任何程序使用??梢栽谝慌_(tái)實(shí)際的控制臺(tái)上
? ?打印這些消息,也可以將他們寫(xiě)到一個(gè)文件中。
6.cron守護(hù)進(jìn)程再定期安排的日期和時(shí)間執(zhí)行命令。
?
?
編寫(xiě)守護(hù)進(jìn)程時(shí)需要遵循一些基本規(guī)則 ,以防產(chǎn)生不必要的交互:
1)首先調(diào)用umask將文件模式創(chuàng)建屏蔽字設(shè)置為一個(gè)已知值(通常是0),由繼承的來(lái)的文件模式創(chuàng)建屏蔽字
? ?可能會(huì)被設(shè)置為拒絕某些權(quán)限。如果守護(hù)進(jìn)程要?jiǎng)?chuàng)建文件,那么它可能要設(shè)置特定的權(quán)限。
2)調(diào)用fork,然后使父進(jìn)程exit,這樣做實(shí)現(xiàn)下面幾點(diǎn)
? ? a)如果該守護(hù)進(jìn)程是作為第一條簡(jiǎn)單的shell命令啟動(dòng)的,那么父進(jìn)程終止會(huì)讓shell認(rèn)為這條命令已經(jīng)執(zhí)行
? ? ? ?完畢
? ? ?b)雖然子進(jìn)程繼承了父進(jìn)程的進(jìn)程組ID,但獲得了一個(gè)新的進(jìn)程ID,這樣就保證了子進(jìn)程不是一個(gè)進(jìn)程組
? ? ? ? 的組長(zhǎng)進(jìn)程,這是蝦米要進(jìn)行的setsid調(diào)用的先決條件
3)調(diào)用setsid建一個(gè)會(huì)話,然后
? ? ?a)使進(jìn)程成為會(huì)話的首進(jìn)程
? ? ?b)成為一個(gè)新進(jìn)程進(jìn)程組的組長(zhǎng)進(jìn)程
? ? ?c)沒(méi)有控制終端
4)將當(dāng)前工作目錄更改為根目錄。從父進(jìn)程處繼承過(guò)來(lái)的當(dāng)前工作目錄可能再一個(gè)掛載的文件系統(tǒng)中。因?yàn)?
? ? 守護(hù)進(jìn)程通常在系統(tǒng)再引導(dǎo)之前是一直存在的,所以如果守護(hù)進(jìn)程的當(dāng)前工作目錄在一個(gè)掛載文件系統(tǒng)
? ? 中,那么該文件系統(tǒng)就不能被卸載。
5)關(guān)閉不在需要的文件描述符,這使得守護(hù)進(jìn)程不再持有從父進(jìn)程繼承來(lái)的任何文件描述符(父進(jìn)程可能是
? ? shell進(jìn)程,或者其他某個(gè)進(jìn)程)。可以使用open_max函數(shù)或getrlimit函數(shù)來(lái)判定最高文件描述符值,并
? ? 關(guān)閉知道該值的所有描述符
6)某些守護(hù)進(jìn)程打開(kāi)/dev/null使其具有文件描述符0,1,2這樣,任何一個(gè)試圖讀標(biāo)準(zhǔn)輸入,寫(xiě)標(biāo)準(zhǔn)輸出
? ?或標(biāo)準(zhǔn)錯(cuò)誤的庫(kù)例程都不會(huì)產(chǎn)生任何效果。因?yàn)槭刈o(hù)進(jìn)程并不與終端設(shè)備相關(guān)聯(lián)
?
?
?
出錯(cuò)記錄
守護(hù)進(jìn)程調(diào)用syslog函數(shù),將日志寫(xiě)入到一個(gè)集中式的地方
有以下三種產(chǎn)生日志消息的方法
1)內(nèi)核例程可以調(diào)用log函數(shù),任何一個(gè)用戶進(jìn)程都可以通過(guò)打開(kāi)(open)并讀取/dev/klog設(shè)備來(lái)讀取這些
? ?消息
2)大多數(shù)用戶進(jìn)程(守護(hù)進(jìn)程)調(diào)用syslog函數(shù)來(lái)產(chǎn)生日志消息,這使得消息發(fā)送至UNIX域數(shù)據(jù)報(bào)字段/dev/log
3)無(wú)論一個(gè)用戶進(jìn)程是在此主機(jī)上,還是通過(guò)TCP/IP網(wǎng)絡(luò)連接到此主機(jī)的其他主機(jī)上,都可以將日志消息
? ?發(fā)向UDP端口514。syslog函數(shù)從不產(chǎn)生這些UDP數(shù)據(jù)報(bào)他們要求產(chǎn)生次消息日志的進(jìn)程進(jìn)行顯示的網(wǎng)絡(luò)
? ?編程
?
BSD的syslog設(shè)施
?
?
syslog的 openlog函數(shù)的option參數(shù)
option | 說(shuō)明 |
LOG_CONS | 若日志消息不能通過(guò)UNXI域數(shù)據(jù)報(bào)發(fā)送至syslogd,則將消息寫(xiě)至控制臺(tái) |
LOG_NEDLAY |
立即打開(kāi)至syslogd守護(hù)進(jìn)程的UNIX域數(shù)據(jù)報(bào)套接字,不要等到第一條消息已經(jīng)被記錄時(shí) 再打開(kāi)。通常在記錄第一條消息之前,不打開(kāi)該套接字 |
LOG_NOWAIT |
不要等待在將消息記入日志過(guò)程中可能已創(chuàng)建的子進(jìn)程。因?yàn)樵賡yslog調(diào)用wait時(shí),應(yīng)用 程序可能已獲得了子進(jìn)程的狀態(tài),這種處理阻止了與捕捉SIGCHLD信號(hào)的應(yīng)用程序之間 產(chǎn)生的沖突 |
LOG_ODELAY | 在第一條消息被記錄之前延遲打開(kāi)至syslogd守護(hù)進(jìn)程的連接 |
LOG_PERROR | 除將日志消息發(fā)送給syslogd外,還將它寫(xiě)至標(biāo)準(zhǔn)出錯(cuò)(在Solaris上不可用) |
LOG_PID |
記錄每條消息都要包含進(jìn)程ID,此選項(xiàng)可供對(duì)每個(gè)不同的請(qǐng)求都fork一個(gè)子進(jìn)程的守護(hù) 進(jìn)程使用(與從不調(diào)用fork的守護(hù)進(jìn)程相比較,如syslogd) |
?
openlog的facility參數(shù)
facility | 說(shuō)明 |
LOG_AUDIT | 審計(jì)設(shè)施 |
LOG_AUTH | 授權(quán)程序login,su,getty等 |
LOG_AUTHPRIV |
與LOG_AUTH相同,但寫(xiě)日志文件時(shí) 具有權(quán)限限制 |
LOG_CONCOLE | 將消息寫(xiě)入/dev/console |
LOG_CRON | cron和at |
LOG_DAEMON | 系統(tǒng)守護(hù)進(jìn)程inetd,routed等 |
LOG_FTP | FTP守護(hù)進(jìn)程ftpd |
LOG_KERN | 內(nèi)核產(chǎn)生消息 |
LOG_LOCAL0 | 保留由本地使用 |
LOG_LOCAL1 | 保留由本地使用 |
LOG_LOCAL2 | 保留由本地使用 |
LOG_LOCAL3 | 保留由本地使用 |
LOG_LOCAL4 | 保留由本地使用 |
LOG_LOCAL5 | 保留由本地使用 |
LOG_LOCAL6 | 保留由本地使用 |
LOG_LOCAL7 | 保留由本地使用 |
LOG_LPR | 行式打印機(jī)系統(tǒng)lpd,lpc等 |
LOG_MAIL | 郵件系統(tǒng) |
LOG_NEWS | Usenet網(wǎng)絡(luò)新聞系統(tǒng) |
LOG_NTP | 網(wǎng)絡(luò)時(shí)間協(xié)議系統(tǒng) |
LOG_SECURITY | 安全子系統(tǒng) |
LOG_SYSLOG | syslogd收緊進(jìn)程本身 |
LOG_USER | 來(lái)自掐用戶進(jìn)程的消息(默認(rèn)) |
LOG_UUCP | UUCP系統(tǒng) |
?
syslog中的level(按序排列)
level | 說(shuō)明 |
LOG_EMERG | 緊急(系統(tǒng)不可使用)(最高優(yōu)先級(jí)) |
LOG_ALERT | 必須立即修復(fù)的情況 |
LOG_CRIT | 嚴(yán)重情況(如硬件設(shè)備處錯(cuò)) |
LOG_ERR | 出錯(cuò)情況 |
LOG_WARNING | 警告情況 |
LOG_NOTICE | 正常但重要的情況 |
LOG_INFO | 信息性消息 |
LOG_DEBUG | 調(diào)試消息(最低優(yōu)先級(jí)) |
?
?
?
守護(hù)進(jìn)程遵循以下通用慣例:
1)若守護(hù)進(jìn)程使用鎖文件,那么該文件通常存儲(chǔ)在/var/run目錄中。鎖文件的名字通常是name.pid,如cron.pid是
2)若守護(hù)進(jìn)程支持配置選項(xiàng),那么配置文件通常放在/etc/目錄中。配置文件的名字通常是name.conf,其中
? ? name是該守護(hù)進(jìn)程或服務(wù)的名字,如syslogd守護(hù)進(jìn)程的配置文件通常是/etc/syslog.conf
3)守護(hù)進(jìn)程可用命令行啟動(dòng),但通常他們是系統(tǒng)初始化腳本之一(/etc/rc*或/etc/init.d/*)啟動(dòng)的。如果守護(hù)進(jìn)程
? ?終止時(shí),應(yīng)當(dāng)自動(dòng)的重啟動(dòng)它,則我們可在/etc/inittab中為該守護(hù)進(jìn)程包括respawn記錄項(xiàng),這樣init就將
? ?重新啟動(dòng)該守護(hù)進(jìn)程
4)若一個(gè)守護(hù)進(jìn)程有一個(gè)配置文件,那么當(dāng)該守護(hù)進(jìn)程啟動(dòng)時(shí)會(huì)讀該文件,但在此之后一般就不會(huì)再查看它。
? ?若更改了配置文件,那么守護(hù)進(jìn)程應(yīng)該重啟。為避免這種麻煩,某些守護(hù)進(jìn)程將捕捉SIGHUP信號(hào),當(dāng)他們
? ?接收到該信號(hào)時(shí),重新讀配置文件。因?yàn)槭刈o(hù)進(jìn)程并不與終端相結(jié)合,他們活是無(wú)控制終端的會(huì)話首進(jìn)程,或
? ?是孤兒進(jìn)程組中的成員,所以守護(hù)進(jìn)程沒(méi)有理由期望接收SIGHUP,守護(hù)進(jìn)程可以安全的重復(fù)使用SIGHUP
?
?
?
?
?
參考
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
