🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
`daemon`:守护进程,后台程序 [TOC] ## 类型 ### stand_alone daemon(专门业务窗口) 可自行启动而不需通过其他机制的管理。启动并加载到内存后就一直占用内存与系统资源。 * 优点:在内存里持续提供服务,响应速度快。 * 缺点:持续占用内存与系统资源。 常见的stand_alone daemon: * 提供WWW服务:`httpd` * 提供FTP服务:`vsftpd` * 实现循环型例行性工作调度服务:`crond` ### super daemon(综合业务窗口) 常驻内存,负责响应客户端的请求,加载对应的服务(未被启动的进程)到内存(成为daemon)响应请求,服务处理完毕请求与客户端连接关闭后就删除服务,释放服务所占用的系统资源。 * 优点:具有安全管控的机制(类似防火墙);启用的服务不会一直占用系统资源,与客户端的连接关闭后就释放系统资源。 * 缺点:服务的反应时间会慢一点。 早期的super daemon是`inetd`,后来被`xinetd`所代替。 常见的需要super daemon唤醒的服务: telnet 处理模式: * multi-threaded(多线程) 一个服务同时有多个进程(并行处理)。 * single-threaded(单线程) 一个服务只有一个进程(串行处理)。 ### signal-control 这种工作形态的daemon,任何客户端的请求进入,都会立即响应进行处理。例如:`cupsd`(打印机的服务)。 ### interval-control 这种工作形态的daemon,是每隔一段时间就主动执行某项工作。间隔时间和工作内容要在该服务的配置文件中自动。 例如:`atd`和`crond` ## 命名规则 服务的名称被创建后,被挂上Linux使用时,通常在服务的名称之后都会加一个字母‘d‘(代表daemon)。 ## 服务与端口的对应 系统所有的功能都是由不同的程序来实现。 进程(内存中运行的程序)则是通过触发程序而产生。 系统提供的服务通过进程来实现。 系统/主机通过端口号(port number)来分辨不同的请求。 查看文件`/etc/services`内容就可以知道当前系统的服务和对应端口号。也可以通过修改该文件中的内容来更改某个服务的端口号。 ~~~ [root@tatahy-lamp selinux]# cat /etc/services | grep 'mysql' mysql 3306/tcp # MySQL mysql 3306/udp # MySQL mysql-cluster 1186/tcp # MySQL Cluster Manager mysql-cluster 1186/udp # MySQL Cluster Manager mysql-cm-agent 1862/tcp # MySQL Cluster Manager Agent mysql-cm-agent 1862/udp # MySQL Cluster Manager Agent mysql-im 2273/tcp # MySQL Instance Manager mysql-im 2273/udp # MySQL Instance Manager mysql-proxy 6446/tcp # MySQL Proxy mysql-proxy 6446/udp # MySQL Proxy ~~~ `协议`:统一整个因特网的端口号对应的服务(进程),让所有的主机都能够使用相同的机制来提供服务与请求服务。 有些约定俗成的服务都放置在同一个端口号上。 例如: * 浏览器的url栏里的http会让浏览器向www服务器的80端口发送连接请求; * www服务器也会将httpd这个进程激活在80端口。 ## 启动 提供某个服务的daemon是一个进程,但启动这个daemon还需要: * 执行文件 * 配置文件 * 执行环境 启动daemon后,操作系统还会记录该进程的PID放置在`/var/run`目录下。 为了一气呵成完成上述一系列的操作,操作系统提供了执行daemon的启动脚本(shell script)的方式来完成daemon的启动。 以CentOS 5.x为例,与daemon有关的文件为: 1. 服务启动脚本 `/etc/init.d/*` 2. 服务初始化环境配置文件 `/etc/sysconfig/*` 3. 各服务各自的配置文件 `/etc/*` 4. 各服务产生的数据库 `/var/lib/*` 5. 各服务的程序PID记录处`/var/run/*` 6. super daemon配置文件 `/etc/xinetd.conf`,`/etc/xinetd.d/*` ### `stand alone daemon`的启动 示例: ~~~ [root@www~]# service crond restart [root@www~]# /etc/init.d/crond restart #上述2种方法都可以重新启动crond ~~~ 1. `/etc/init.d/*`启动 几乎系统上面所有服务的启动脚本都在`/etc/init.d/`下面,这里面的脚本会去检测环境、 查找配置文件、 加载distribution 提供的函数功能、判断环境是否可以运行此 daemon等。 等到一切都检测完毕且确定可以运行后,再以 shell script 的 case...esac 语法来启动、 关闭、 查看此daemon。 例如:运行脚本`/etc/init.d/syslog` ~~~ [root@www ~]# /etc/init.d/syslog 用法: /etc/init.d/syslog {start|stop|status|restart| condrestart) # 什么参数都不加的时候, 系统会告诉你可以用的参数有哪些, 如上所示. 范例一: 查看 syslog 这个 daemon 目前的状态 [root@www ~]# /etc/init.d/syslog status syslogd (pid 4264) 正在执行... klogd (pid 4267) 正在执行... # 代表 syslog 管理两个 daemon, 这两个 daemon 正在运行中. 范例二: 重新让 syslog 读取一次配置文件 [root@www ~]# /etc/init.d/syslog restart 正在关闭内核记录器: [ 确定 ] 正在关闭系统记录器: [ 确定 ] 正在启动系统记录器: [ 确定] 正在启动内核记录器: [确定 ] [root@www ~]# /etc/init.d/syslog status syslogd (pid 4793)正在执行... klogd (pid 4796) 正在执行... # 因为重新启动过, 所以PID 与第一次查看的值就不一样了. ~~~ 2. `service`启动 另外,CentOS中提供`service`可以用来启动`stand alone`类型的服务的脚本。`service`就是一个脚本(路径:`/sbin/service`),它通过分析`service`后面的参数再到`/etc/init.d/`目录下取得正确的服务来`start`或`stop`。 ~~~ [root@www~]# service [service name](start|stop|restartl...) [root@www~]# service --status-all ~~~ 参数: `service name`:即是需要启动的服务名称,需与 `/etc/init.d/` 对应; `startl...`:即是该服务要进行的工作; `--status-all`:将系统所有的`stand alone`的服务状态全部列出来。 ### `super daemon`的启动 因为`super daemon`自己要常驻内存,才能管理后续的其他服务,所以其启动方式与`stand alone daemon`是一样的。 但它管理的其他daemon必须要在对应的配置文件(路径:`/etc/xinetd.d/*`)中设为启动该daemon才行 ## `systemd`服务 [[参考文档]]([https://www.linuxidc.com/Linux/2015-07/120833.htm](https://www.linuxidc.com/Linux/2015-07/120833.htm)) 从CentOS7.x开始,CentOS开始使用`systemd`服务来代替`daemon`,原来管理系统启动和管理系统服务的相关命令全部由`systemctl`命令来代替。 `Systemctl`是一个`systemd`工具,主要负责控制`systemd`系统和服务管理器。它整合了`chkconfig` 与` service`功能于一体。 `Systemd`是一个系统管理守护进程、工具和库的集合,用于取代`System V`初始进程。`Systemd`的功能是用于集中管理和配置类UNIX系统。 在Linux生态系统中,`Systemd`被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署。`Systemd`通常是所有其它守护进程的父进程,但并非总是如此。 **1、原来的 service 命令与 systemctl 命令对比** | daemon命令 | systemctl命令 | 说明 | | --- | --- | --- | | service \[服务\] start | systemctl start \[unit type\] | 启动服务 | | service \[服务\] stop | systemctl stop \[unit type\] | 停止服务 | | service \[服务\] restart | systemctl restart \[unit type\] | 停止服务 | 此外还是二个systemctl参数没有与service命令参数对应 `status`:参数来查看服务运行情况 `reload`:重新加载服务,加载更新后的配置文件(并不是所有服务都支持这个参数,比如network.service) 应用举例: ~~~ #启动网络服务 systemctl start network.service #停止网络服务 systemctl stop network.service #重启网络服务 systemctl restart network.service #查看网络服务状态 systemctl status network.serivce ~~~ 例如在上安装http ~~~ [root@CentOS7 ~\]# yum -y install httpd 启动服务(等同于service httpd start) systemctl start httpd.service 停止服务(等同于service httpd stop) systemctl stop httpd.service 重启服务(等同于service httpd restart) systemctl restart httpd.service 查看服务是否运行(等同于service httpd status) systemctl status httpd.service 开机自启动服务(等同于chkconfig httpd on) systemctl enable httpd.service 开机时禁用服务(等同于chkconfig httpd on) systemctl disable httpd.service 查看服务是否开机启动 (等同于chkconfig --list) ~~~