什么是Daemon
Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。Daemon程序一般作为系统服务使用。Unix/Linux中的daemon进程类似于Windows中的后台服务进程,例如http服务进程nginx,ssh服务进程sshd等。
ps -axj 命令打印系统中各进程的状态。
选择项- a显示由其他用户所拥有的进程的状态。
-x显示没有控制终端的进程的状态。
-j显示与作业有关的信息:对话期 ID、进程组ID、控制终端以及终端进程组 ID。
.
进程0,1,2,这些进程非常特殊,存在于系统的整个生命期中。 它们没有父进程ID,没有组进程ID,也没有对话期ID。
进程ID0是调度进程,常常被称为交换进程(swapper)。该进程并不执行任何磁盘上的程序—它是内核的一部分,因此也被称为系统进程。
进程ID1通常是init进程,在自举过程结束时由内核调用。该进程的程序文件在UNIX的早期版本中是/etc/init,在较新版本中是/sbin/init。此进程负责在内核自举后起动一个UNIX系统.init通常读与系统有关的初始化文件(/etc/rc*文件),并将系统引导到一个状态(例如多用户)。init进程决不会终止。它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程 ),但是它以超级用户特权运行。
在某些UNIX的虚存实现中,进程ID 2是页守护进程( pagedaemon)。此进程负责支持虚存系统的请页操作。与交换进程一样,页守护进程也是内核进程。
syslogd守护进程可用于任何为操作人员记录系统消息的程序中。可以在一台实际的控制台上打印这些消息,也可将它们写到一个文件中。
sendmail是标准邮递守护进程。
update程序定期将内核缓存中的内容写到硬盘上(通常是每隔30秒)。为了做到这一点,该程序每隔 3 0秒调用sync(2)函数一次。
cron守护进程在指定的日期和时间执行指定的命令。许多系统管理任务是由 cron定期地使相关程序执行而得以实现的。
inetd守护进程,它监听系统的网络界面,以输入对各种网络服务器的请求。
lpd处理对系统提出的各个打印请求。
注意,所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端——终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端可能是守护进程调用了setsid的结果。除update以外的所有守护进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。update是它所在进程组(37)和对话期(37)中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止。最后,应当引起注意的是所有这些精灵进程的父进程都是init进程。
Daemon的分类
分类方式一:按照“是否可以独立启动”分类
stand alone类型的daemon
这种类型的daemon可以自行启动,启动之后可以常驻内存,直到手动关闭该daemon才释放资源。
最大的优点是响应速度快,多用于能够随时接受远程请求的服务,如WWW的daemon(httpd)、FTP的daemon(vsftpd)等。
由super daemon管理的daemon
这种类型的daemon由super daemon统一管理,当请求到来时,由super daemon启动请求的服务,请求完成后便释放内存资源。
早期的super daemon是inetd,后来被xinetd替代了。
注意:super daemon本身是一个stand alone的服务,因为它需要管理后续的其他服务,所以它自己本身当然需要常驻内存中。
两者的区别:
stand alone类型的daemon可以自行启动,无需依赖其他daemon;而super daemon管理的daemon必须借助super daemon来启动;
stand alone类型的daemon启动后便常驻内存,而被super daemon管理的daemon只有等到用户请求时才被加载进内存,并且在请求完成后便释放内存资源。由于后者每次请求到来的时候才被加载进内存,因此响应速度比stand alone型daemon要慢。但是它执行完就释放内存资源,因此更节约内存资源。
分类方式二:按照“请求到来时是否能够立即运行”分类
signal-control类型的daemon
这种类型的daemon当有请求到来时便能立即执行。
interval-control类型的daemon
这种类型的daemon会周期性地执行某项工作,因此它没有请求一说,它会周期性地读取配置文件,并执行配置文件中要求的功能。如crond、atd都属于interval-control类型的daemon。
Daemon的启动
服务启动脚本存放位置
Linux系统中有一个公认的目录用来存放服务启动脚本: ”/etc/init.d/“。即使有些Linux系统的服务启动脚本没有放在/etc/init.d/目录下,它也会设置连接文件到/etc/init.d/下的。
与daemon相关的目录介绍
/etc/init.d/
该目录存放所有stand alone型daemon的初始化脚本。
/etc/sysconfig/
该目录存放所有daemon的初始化配置文件。
/etc/xinetd.conf
该文件是super daemon的配置文件。
该文件将会加载/etc/xinetd.d/目录下的所有配置文件。
/etc/xinetd.d/
该目录存放所有被super daemon管理的daemon的配置文件。
daemon启动或关闭就在这些配置文件中配置。
/etc/
该目录存放各daemon各自的配置文件。
/var/lib/
该目录存放各daemon的数据库文件。
/var/run/
该目录记录各daemon的PID。
服务启动方式
stand alone型Daemon的启动方式
通过/etc/init.d/xxx启动
启动一个服务是一个繁琐的过程,你需要进行一系列启动前的操作,为了避免这些麻烦,服务提供商把这些繁琐的过程封装在一个shell srcipt中,我们只需执行一个shell script即可启动一个daemon。几乎所有的stand alone型daemon的启动脚本都放在/etc/init.d/下,所以我们只需执行/etc/init.d/xxx start即可启动xxx服务。
通过service命令启动
若每次启动一个命令都要写/etc/init.d/略微有些麻烦,service命令将其进行了封装,我们只要执行service xxx start/status/restart/stop即可开启/查看/重启/关闭xxx服务。
super daemon型Daemon的启动方式
step1:设置daemon的配置文件
每一个被super daemon管理的daemon都有一个配置文件,在/etc/xinetd.d/目录下。每个daemon的开启或关闭均在该daemon对应的配置文件中设置。
step2:启动super daemon
super daemon是一个stand alone型daemon,因此在daemon的配置文件设置好后可通过service xinetd start启动所有由super daemon管理的daemon。
简单小结:服务启动方式
(1)通用的启动方式:/etc/init.d/* {start|stop|status|restart}。
(2)部分系统特有的:service [service name] {start|stop|status|restart}
和 rc[service name] {start|stop|status|restart}。
例如重启crontab服务,分别用以上三种方式:
/etc/init.d/crond restart
service crond restart
rccrond restart
设置Daemon开启启动
Linux启动时可以选择有不同的开机等级,不同等级将会开启