linux daemon process
Linux Daemon Process
所谓daemon进程就是用于在linux系统中提供各种服务的进程(通常程序名以d结尾,例如:atd,crond,mongod等),一般提供的服务有:http服务,ftp服务,打印服务,邮件管理服务等,daemon译为守护之意,它就像linux系统的忠实守护者,在系统初始化完成后启动daemon以等待用户的交互,可以说daemon是一套系统响应用户请求的机制
daemon的工作模式
系统中的daemon提供了两种工作模式,一种称之为stand alone,在该模式下daemon常驻内存中,发生服务请求时可以立即进行响应,与之相对的另一种模式是通过super daemon(一个普通的daemon,程序名为xinetd)进行托管,只有在发生服务请求时super daemon才会将相应的daemon唤醒以进行响应,使用哪种工作模式取据于具体的业务场景,比如www服务,显然如果采用super daemon托管模式的话,响应会比较慢,此外通过super daemon还可以对被托管的daemon进行安全控制保护(下文中除非写作super daemon,否则daemon一律指stand alone daemon)
daemon与端口是两个独立的概念
有的daemon出于数据通信的目的,会通过监听特定的端口(端口是操纵系统提供的虚拟的数据通信接口)来同服务请求者进行通信,对于一些常用的daemon(著名的),例如http,ftp,ssh都约定了特定的端口进行通信(均是小于1024的端口),另外一些非著名的daemon或者某些程序也会端口进行通信(1024到65535的端口),要注意的是不同程序监听的端口可别混淆了,因为通信双方常常对用于通信的数据格式有一些约定的(从网络层次上讲就是应用层通信协议,例如http协议,ftp协议等),总之,daemon不一定会占用端口,占用端口的也不仅仅只有daemon程序,要明白端口的设计思想是操作系统提供的一个虚拟的数据通信接口,而仅仅只是有部分daemon会使用端口进行数据通信罢了(查看系统上端口的分配情况: cat /etc/services
,网络daemon状态查看命令:netstat
)
daemon如何知道请求发生了
有的daemon通过接受来自系统signal来感知服务请求的发生,也就是说系统作为中间人将发生的请求事件告知(使用signal通信机制)相应的daemon,另外的一种方式是,daemon自己通过轮询来查看是否有请求发生,具体的例子就是,crond间隔一段时间查看有无定时任务要被执行
daemon配置文件
下面将以一个数据库daemon,mongod的配置文件进行举例
系统有专门的脚本负责启动daemon程序,启动脚本的位置:/etc/init.d/*,例:/etc/init.d/mongod
daemon相关的环境配置文件:/etc/sysconfig/*,例:/etc/sysconfig/mongod
daemon程序自己运行时的一些参数的设置文件的位置:/etc/*,例:/etc/mongod.conf,也许有的daemon配置参数复杂,那么应该一个以daemon命名的目录
daemon相关的数据目录:/var/lib/*,例:/var/lib/mongo/
daemon的PID记录位置:/var/run/*,例:/var/run/mongodb/mongod.pid
daemon的启动
daemon既可以用户手动启动,也可以配置为开机自动启动的(后面会对自动启动有所介绍)
直接调用启动脚本(即/etc/init.d/*目录中的脚本)来启动daemon
$ /etc/init.d/mongod start # 启动
$ /etc/init.d/mongod restart # 重启,如果你修改了daemoon的配置文件,也许就要重启了
$ /etc/init.d/mongod status # 查看当前状态,此外还有stop等指令可用
间接通过命令service来启动daemon
$ service mongod status # service命令只是简单的将参数传递给相应的启动脚本罢了
$ service --status-all # 查询系统上所有daemon的状态
开机启动daemon
很多daemon都是开机时自动启动的,设置开机自动启动的原理是,系统开机时会执行位于/etc/rc.d/rc[0-6].d/*中的脚本,所以你只要将启动daemon所用的脚本放在这里即可(事实上,在这些目录中大多都是/etc/init.d/中启动脚本的连接文件),rc[0-6].d表示的系统会根据不同的运行级别开机时启动不同的daemon
对于系统daemon你不需要自己创建启动脚本的连接文件然后复制到/etc/rc.d/rc[0-6].d/中,这里有现成的命令可用
$ chkconfig httpd on # 使得服务开机自启动
$ chkconfig httpd off # 关闭开机启动
$ chkconfig --level 3 httpd on # 指定在run-level为3时开机自启动
$ chkconfig --list httpd # 查看httpd在各个运行级别开机启动的设置
但如果你是打算在开机时启动自定义服务呢?
1. 首先,创建一个可执行启动脚本放在/etc/init.d/目录中
2. 通过 `chkconfig --add scriptname` 将其添加到开机自启动中
3. 撤销的方法是 `chkconfig --del scriptname` 并将/etc/init.d/中的文件删除
super daemon的启动以及配置
super daemon自身的配置文件:/etc/xinetd.conf
被super daemon托管的daemon的配置文件位置:/etc/xinetd.d/*
因为super daemon自身只是一个普通的daemon,所以可以使用上面普通daemon的方法对其进行启动
$ /etc/init.d/xinetd start
$ service xinetd start
对于被托管在super daemon的程序来说,只要修改位于/etc/xinetd.d/*中相应的配置文件即可,super daemon会在请求到来时唤醒相应的daemon(注意,在修改配置文件后要重启super daemon)
被super daemon管理daemon的网络控制
网络控制主要使用黑名单(/etc/hosts.deny)和白名单(/etc/hosts.allow)机制实现