守護(hù)進(jìn)程的特征
編程規(guī)則
首先要做的是調(diào)用 umask 將文件模式創(chuàng)建屏蔽字設(shè)置為一個(gè)已知值
調(diào)用 fork,然后使父進(jìn)程 exit
-
調(diào)用setsid 創(chuàng)建一個(gè)新會(huì)話:使調(diào)用進(jìn)程:(a)成為
新會(huì)話的首進(jìn)程,(b)成為一個(gè)新進(jìn)程組的組長(zhǎng)進(jìn)程,(c)沒有控制終端
將當(dāng)前工作目錄更改為根目錄
關(guān)閉不再需要的文件描述符
某些守護(hù)進(jìn)程打開/dev/null 使其具有文件描述符 0、1 和2
出錯(cuò)記錄
3 種產(chǎn)生日志消息的方法
- 內(nèi)核例程可以調(diào)用 log 函數(shù)
- 大多數(shù)用戶進(jìn)程(守護(hù)進(jìn)程)調(diào)用 syslog(3)函數(shù)來產(chǎn)生日志消息
- 無論一個(gè)用戶進(jìn)程是在此主機(jī)上,還是在通過 TCP/IP 網(wǎng)絡(luò)連接到此主機(jī)的其他主機(jī)上,
都可將日志消息發(fā)向 UDP 端口 514
syslogd 守護(hù)進(jìn)程讀取所有 3 種格式的日志消息
- 緊急消息可發(fā)送至系統(tǒng)管理員(若已登錄)
- 警告消息則可記錄到一個(gè)文件中
#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);
#include <syslog.h>
#include <stdarg.h>
void vsyslog(int priority, const char *format, va_list arg);
單實(shí)例守護(hù)進(jìn)程
lockfile(fd)
守護(hù)進(jìn)程的慣例
若守護(hù)進(jìn)程使用鎖文件,那么該文件通常存儲(chǔ)在/var/run 目錄中(可能需要具有超級(jí)用戶權(quán)限才能在此目錄下創(chuàng)建文件),鎖文件的名字通常是 name.pid,其中,name 是該守護(hù)進(jìn)程或服務(wù)的名字。例如,cron 守護(hù)進(jìn)程鎖文件的名 字是/var/run/crond.pid
若守護(hù)進(jìn)程支持配置選項(xiàng),那么配置文件通常存放在/etc 目錄中。配置文件的名字通常 是 name.conf,其中,name 是該守護(hù)進(jìn)程或服務(wù)的名字
守護(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)程。下面是centos7的inttab文件,已被取代
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#