守护进程(服务)

Linux 中的服务是一类常驻内存的进程,这类进程启动后在后台不断运行,通常为监听某个端口,负责一些系统提供的功能来服务用户,例如 ssh、nginx、MySQL 等都属于服务,这类进程被成为守护进程(daemon)。

Linux 的启动进程

操作系统在加载完系统内核之后,进入系统初始化阶段,在之前都是采用 init 进程,从 Centos7 开始使用 Systemd。systemd 即 system daemon 为系统的启动和管理提供了一套完整的解决方案。

1
2
3
/etc/init.d 是 sysVinit 服务的启动方式,一些古老的系统使用这个;
service 也是 sysVinit,相较于/etc/init.d 先进一些,但底层还是调用 /etc/init.d;
systemctl 是 systemd 的调用方式,目前大多数主流发行版已经采用或将要采用这种方式。

init 进行通过下面命令启动

1
2
3
sudo /etc/init.d/nginx start
# 或者
service apache2 start

这种方法有两个缺点。
一是启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程;
二是启动脚本复杂。init 进程只是执行启动脚本,启动脚本需要适应处理各种情况。

systemd 是一个系统管理守护进程、工具和库的集合,克服了 sysvinit 固有缺点,提高了系统启动速度。

Systemd 功能强大,但体系庞大,结构复杂。

Systemd

Systemd 是第一个用户空间程序,属于应用程序,不属于 Linux 内核范畴,这个进程的 PID 为 1。

可以使用命令 ps ax | grep systemd 查看进程,如下图。
ps
可知该进程的 PID 为 1,路径是/usr/lib/systemd/systemd

基本命令

  1. 开机启动

    对于支持 systemd 的程序,在安装时会在 /usr/lib/systemd/system 目录中添加一项配置文件

    执行 sudo systemctl enable service_name 会在 /etc/systemd/system 目录中添加一个符号链接,指向/usr/lib/systemd/system 中的配置文件。

    开机时,Systemd 只执行 /etc/systemd/system 目录中的配置文件

  2. 启动服务

    1
    sudo systemctl start service_name

    执行上面命令可以立即启动服务,利用 systemctl status 可以查看服务的状态。

  3. 停止服务

    1
    2
    3
    4
    5
    sudo systemctl stop service_name
    # 如果没有停下来,就需要"杀进程"
    sudo systemctl kill service_name
    # 重启服务
    sudo systemctl restart service_name

reference

  1. Linux 启动流程
  2. CentOS7 启动流程
  3. 阮一峰 Systemd 入门
  4. 阮一峰 实战
  5. CentOS7 新特征——Systemd 取代 init
  6. systemd 简单介绍
  7. Linux 服务管理