?
?
?
相關函數列表
//syslog函數 #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,很多平臺還提供它的一種變體來處理可變參數列表 #include <syslog.h> #include <stdarg.h> void vsyslog(int priority, const char *format, va_list arg);
?
?
ps -efj
結構如下
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,進程ID,父進程ID,進程組ID,會話ID,終端名稱以及命令字符串
?
?
Linux中的守護進程
1.kswapd守護進程也稱為內存換頁守護進程。它支持虛擬內存子系統在經過一段時間后將臟頁面慢慢的寫會
? ?磁盤來回收這些頁面
2.flush守護進程再可用內存達到設置的最小閥值時將臟頁面刷新到磁盤。它也定期的將臟頁面刷新回磁盤來
? ?減少在系統出現故障時發生的數據丟失。多個刷新守護進程可以同時存在,每個寫回設備都有一個刷新守護
? ?進程。輸出實例中顯示一個名為flush-8:0的刷新守護進程。從名字可以看出,寫回設備室通過主設備號(8)和
? ?副設備號(0)來識別的
3.sync_supers守護進程定期將文件系統刷新到磁盤
4.jbd守護進程幫助實現了ext4文件系統中的日志功能
5.rpcbind守護進程提供將遠程過程調用(Remote Procedure Call RPC)程序號映射為網絡端口號的服務。
? ?syslogd守護進程可以被由管理員啟動的將系統消息記入日志的任何程序使用。可以在一臺實際的控制臺上
? ?打印這些消息,也可以將他們寫到一個文件中。
6.cron守護進程再定期安排的日期和時間執行命令。
?
?
編寫守護進程時需要遵循一些基本規則 ,以防產生不必要的交互:
1)首先調用umask將文件模式創建屏蔽字設置為一個已知值(通常是0),由繼承的來的文件模式創建屏蔽字
? ?可能會被設置為拒絕某些權限。如果守護進程要創建文件,那么它可能要設置特定的權限。
2)調用fork,然后使父進程exit,這樣做實現下面幾點
? ? a)如果該守護進程是作為第一條簡單的shell命令啟動的,那么父進程終止會讓shell認為這條命令已經執行
? ? ? ?完畢
? ? ?b)雖然子進程繼承了父進程的進程組ID,但獲得了一個新的進程ID,這樣就保證了子進程不是一個進程組
? ? ? ? 的組長進程,這是蝦米要進行的setsid調用的先決條件
3)調用setsid建一個會話,然后
? ? ?a)使進程成為會話的首進程
? ? ?b)成為一個新進程進程組的組長進程
? ? ?c)沒有控制終端
4)將當前工作目錄更改為根目錄。從父進程處繼承過來的當前工作目錄可能再一個掛載的文件系統中。因為
? ? 守護進程通常在系統再引導之前是一直存在的,所以如果守護進程的當前工作目錄在一個掛載文件系統
? ? 中,那么該文件系統就不能被卸載。
5)關閉不在需要的文件描述符,這使得守護進程不再持有從父進程繼承來的任何文件描述符(父進程可能是
? ? shell進程,或者其他某個進程)。可以使用open_max函數或getrlimit函數來判定最高文件描述符值,并
? ? 關閉知道該值的所有描述符
6)某些守護進程打開/dev/null使其具有文件描述符0,1,2這樣,任何一個試圖讀標準輸入,寫標準輸出
? ?或標準錯誤的庫例程都不會產生任何效果。因為守護進程并不與終端設備相關聯
?
?
?
出錯記錄
守護進程調用syslog函數,將日志寫入到一個集中式的地方
有以下三種產生日志消息的方法
1)內核例程可以調用log函數,任何一個用戶進程都可以通過打開(open)并讀取/dev/klog設備來讀取這些
? ?消息
2)大多數用戶進程(守護進程)調用syslog函數來產生日志消息,這使得消息發送至UNIX域數據報字段/dev/log
3)無論一個用戶進程是在此主機上,還是通過TCP/IP網絡連接到此主機的其他主機上,都可以將日志消息
? ?發向UDP端口514。syslog函數從不產生這些UDP數據報他們要求產生次消息日志的進程進行顯示的網絡
? ?編程
?
BSD的syslog設施
?
?
syslog的 openlog函數的option參數
option | 說明 |
LOG_CONS | 若日志消息不能通過UNXI域數據報發送至syslogd,則將消息寫至控制臺 |
LOG_NEDLAY |
立即打開至syslogd守護進程的UNIX域數據報套接字,不要等到第一條消息已經被記錄時 再打開。通常在記錄第一條消息之前,不打開該套接字 |
LOG_NOWAIT |
不要等待在將消息記入日志過程中可能已創建的子進程。因為再syslog調用wait時,應用 程序可能已獲得了子進程的狀態,這種處理阻止了與捕捉SIGCHLD信號的應用程序之間 產生的沖突 |
LOG_ODELAY | 在第一條消息被記錄之前延遲打開至syslogd守護進程的連接 |
LOG_PERROR | 除將日志消息發送給syslogd外,還將它寫至標準出錯(在Solaris上不可用) |
LOG_PID |
記錄每條消息都要包含進程ID,此選項可供對每個不同的請求都fork一個子進程的守護 進程使用(與從不調用fork的守護進程相比較,如syslogd) |
?
openlog的facility參數
facility | 說明 |
LOG_AUDIT | 審計設施 |
LOG_AUTH | 授權程序login,su,getty等 |
LOG_AUTHPRIV |
與LOG_AUTH相同,但寫日志文件時 具有權限限制 |
LOG_CONCOLE | 將消息寫入/dev/console |
LOG_CRON | cron和at |
LOG_DAEMON | 系統守護進程inetd,routed等 |
LOG_FTP | FTP守護進程ftpd |
LOG_KERN | 內核產生消息 |
LOG_LOCAL0 | 保留由本地使用 |
LOG_LOCAL1 | 保留由本地使用 |
LOG_LOCAL2 | 保留由本地使用 |
LOG_LOCAL3 | 保留由本地使用 |
LOG_LOCAL4 | 保留由本地使用 |
LOG_LOCAL5 | 保留由本地使用 |
LOG_LOCAL6 | 保留由本地使用 |
LOG_LOCAL7 | 保留由本地使用 |
LOG_LPR | 行式打印機系統lpd,lpc等 |
LOG_MAIL | 郵件系統 |
LOG_NEWS | Usenet網絡新聞系統 |
LOG_NTP | 網絡時間協議系統 |
LOG_SECURITY | 安全子系統 |
LOG_SYSLOG | syslogd收緊進程本身 |
LOG_USER | 來自掐用戶進程的消息(默認) |
LOG_UUCP | UUCP系統 |
?
syslog中的level(按序排列)
level | 說明 |
LOG_EMERG | 緊急(系統不可使用)(最高優先級) |
LOG_ALERT | 必須立即修復的情況 |
LOG_CRIT | 嚴重情況(如硬件設備處錯) |
LOG_ERR | 出錯情況 |
LOG_WARNING | 警告情況 |
LOG_NOTICE | 正常但重要的情況 |
LOG_INFO | 信息性消息 |
LOG_DEBUG | 調試消息(最低優先級) |
?
?
?
守護進程遵循以下通用慣例:
1)若守護進程使用鎖文件,那么該文件通常存儲在/var/run目錄中。鎖文件的名字通常是name.pid,如cron.pid是
2)若守護進程支持配置選項,那么配置文件通常放在/etc/目錄中。配置文件的名字通常是name.conf,其中
? ? name是該守護進程或服務的名字,如syslogd守護進程的配置文件通常是/etc/syslog.conf
3)守護進程可用命令行啟動,但通常他們是系統初始化腳本之一(/etc/rc*或/etc/init.d/*)啟動的。如果守護進程
? ?終止時,應當自動的重啟動它,則我們可在/etc/inittab中為該守護進程包括respawn記錄項,這樣init就將
? ?重新啟動該守護進程
4)若一個守護進程有一個配置文件,那么當該守護進程啟動時會讀該文件,但在此之后一般就不會再查看它。
? ?若更改了配置文件,那么守護進程應該重啟。為避免這種麻煩,某些守護進程將捕捉SIGHUP信號,當他們
? ?接收到該信號時,重新讀配置文件。因為守護進程并不與終端相結合,他們活是無控制終端的會話首進程,或
? ?是孤兒進程組中的成員,所以守護進程沒有理由期望接收SIGHUP,守護進程可以安全的重復使用SIGHUP
?
?
?
?
?
參考
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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