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)机制实现

Previous