Runlevel

所有的 LInux 系统都有4个共同的基础 runlevel:

  • 0 - Runlevel 0 表示系统关闭
  • 1 - Runlevel 1 表示单用户,恢复模式 (single-user, rescue mode)
  • 5 - Runlevel 5 表示多用户,带网络的图形模式
  • 6 - Runlevel 6 表示系统重启

通常来说,runlevel 2、3 和 4 意味着将会启动为多用户,带网络的命令行模式。

当我们允许一个 service 自动启动时,我们其实是把这个 service 加入到了 runlevel。

Init system

Linux 系统中有常见的三种 init system,很多发行版提供多个 init system 给你选择,或者会允许你安装额外的 init system。

  • System V 是最老的 init system:
    • Debian 6 或更早的系统
    • Ubuntu 9.04 或更早的系统
    • CentOS 5 或更早的系统
  • Upstart:
    • Ubuntu 9.10 到 Ubuntu 14.10, 包括 Ubuntu 14.04
    • CentOS 6
  • systemd 是最近主流的系统发行版都会使用的 init system:
    • Debian 7 和 Debian 8
    • Ubuntu 15.04 或更新
    • CentOS 7

System V

System V 需要在 /etc/init.d/ 里面有你服务的 init 脚本。

启动,停止某个服务

# 启动服务
sudo service your-service start
# 停止服务
sudo service your-service stop
# 查看服务运行状态
sudo service your-service status

把服务设置为开机自动启动

# 非 CentOS 系统用这个命令
sudo update-rc.d your-service enable
# CentOS 系统用这个命令
sudo chkconfig your-service on

这个命令会在 /etc/rc2.d/etc/rc3.d/etc/rc3.d/etc/rc4.d/etc/rc5.d 等目录创建一个符号链接,指向 init.d 目录下对应的服务的 init 脚本。

把服务设置为崩溃时自动启动

需要手动修改 /etc/inittab 文件来实现。

注意:修改 /etc/inittab 文件要非常地小心,如果写错了命令或者不小心删掉了现有的配置,系统可能无法正常启动

/etc/inittab 文件的末尾添加一行:

ms:2345:respawn:/bin/sh /usr/bin/your-service-command

我们在 /etc/inittab 文件中添加了一个命令,使 mysqld_safe 进程能够在崩溃的时候重新启动。它有四个字段,每个字段用 ‘:’ 来分隔。

  • ms:前两个字符指定了进程的 id
  • 2345:第二个字段指定了应用的 runlevel,在这个例子里面,它应用在 runlevel 2, 3, 4 和 5
  • respawn:第三个字段指定了动作。(我们要重新启动进程)
  • /bin/sh /usr/bin/mysqld_safe:终于,最后一个字段指定的是目标进程(要运行的命令)

Upstart

Upstart 使用 /etc/init 目录里面的配置文件来控制服务的运行。这些配置文件被称为 stanza.

启动、停止某个服务

# 启动服务
sudo initctl start your-service
# 停止服务
sudo initctl stop your-service
# 查看服务运行状态
sudo initctl status your-service

把服务设置为开机启动

我们以 MySQL 为例,先看看它的 stanza 文件 /etc/init/mysql.conf

...
description     "MySQL Server"
author          "Mario Limonciello <superm1@ubuntu.com>"

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

我们可以看到当前 MySQL 应该要在 runlevel 2、3、4、5 中自动启动。在其它 runlevel 不自动启动。

这就是我们定义服务在开机的时候的行为的地方。不像 System V 还要使用 update-rc.d 或者 chkconfig 命令。

把服务设置为崩溃后启动

同样是上面的 stanza 文件。respawn 命令顾名思义,就是指明 MySQL 崩溃后要重新启动服务。跟着后面的命令 respawn limit 2 5 指明了在 MySQL 崩溃后,要以 5 秒为间隔尝试重启 2 次。如果还是不成功,那么将会保持停止的状态。

Systemd

配置文件在 /etc/systemd/system/multi-user.target.wants/your-service.service

启动、停止服务

# 启动
sudo systemctl start your-service
# 停止
sudo systemctl stop your-service
# 查看运行状态
sudo systemctl status your-service

把服务设置为开机自动启动

# 查看是否开机自动启动
sudo systemctl is-enabled your-service

# 把服务设置为开机自动启动
sudo systemctl enable your-service

# 把服务设置为开机不自动启动
sudo systemctl disable your-service

把服务设置为崩溃后自动启动

以 MySQL 为例

编辑配置文件 /etc/systemd/system/multi-user.target.wants/mysql.service

在文件的最后,加上 Restart=always

[Unit]
...

[Install]
...

[Service]
...
...
Restart=always
...

设置为 always 意味着不管 MySQL 是否是正常退出,他都会自动重启,如果你想要服务只有在异常退出的时候才重启,那么可以把它指定为 on-failure