本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com 听风:总目录

一、直接在 /etc/rc.d/rc.local 中添加服务启动命令

/etc/rc.d/rc.local 脚本会在 Centos 系统启动时被自动执行,所以我们可以把需要开机后执行的命令直接放在这里。

1、配置文件

[root@NetManager02 ~]# cat /etc/rc.d/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

注:

(1)添加此文件是为了兼容性

(2)强烈建议创建自己的 systemd 服务或 udev 规则,以便在引导期间运行脚本,而不是使用此文件。

(3)与以前的版本相比,由于在引导期间并行执行,此脚本将不会在所有其他服务之后运行。

(4)必须运行 “chmod +x /etc/rc.d/rc.local”,以确保在启动期间执行此脚本。

2、编写服务启动脚本

(1)编写服务启动的脚本

[root@localhost ~]# vi /usr/local/bin/iptables_new.sh

输入启动脚本内容

#!/bin/bash
/bin/systemctl restart iptables.service
iptables -F
iptables -X
……

(2)增加脚本可执行权限

[root@localhost ~]# chmod +x /usr/local/bin/iptables_new.sh

(3)打开 /etc/rc.d/rc.local 文件,在末尾增加如下内容。

/usr/local/bin/iptables_new.sh

(4)在 Centos 7.8 中,/etc/rc.d/rc.local 的权限被降低了,所以需要执行如下命令增加其可执行权限。

[root@localhost ~]# chmod +x /etc/rc.d/rc.local

二、通过 chkconfig 配置服务自启动

在 Centos 7 之前,可以通过 chkconfig 来配置开机自启动服务。

1、语法如下:

chkconfig [--add] [--del] [--list] [系统服务] 或 chkconfig [--level <等级代号>] [系统服务] [on/off/reset]

参数:

--add 增加所指定的系统服务

--del 删除所指定的系统服务

--list 查看服务情况

--level <等级代号> 指定读取系统服务要在哪一个执行等级中开启 & 关闭

等级代表 (查看服务时后面出现的数字):

等级 0 表示:表示关机

等级 1 表示:单用户模式

等级 2 表示:无网络连接的多用户命令行模式

等级 3 表示:有网络连接的多用户命令行模式

等级 4 表示:不可用

等级 5 表示:带图形界面的多用户模式

等级 6 表示:重新启动

命令实例:

chkconfig --list [name] # 查看 chkconfig 所有的服务

chkconfig --add name # 开启指定服务

chkconfig --del name # 关闭指定服务

chkconfig [--level levels] name <on|off|reset> # 设置某一服务在指定的运行级是被启动还是停止或者重置的

chkconfig [--level levels] name

2、示例如下:

[root@localhost ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off

System V 和 systemd 的区别:

类型System Vsystemd
管理方式较早当前主流
脚本位置/etc/init.d/etc/systemd/system
命令servicesystemctl
管理性针对单个服务管理统一管理所有服务
管理方式通过运行 /etc/init.d 下的脚本来启动服务过加载 systemd unit 文件来管理服务
启动速度较慢,顺序启动服务较快,并行启动服务
优点简单易理解更高效,统一管理方式

3、chkconfig 配置的服务启动顺序最后都会在 /etc/rc.d/ 目录下体现出来。

[root@localhost rc.d]# ll
total 4
drwxr-xr-x. 2 root root  70 May 15 17:53 init.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc0.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc1.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc2.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc3.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc4.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc5.d
drwxr-xr-x. 2 root root  45 May 15 17:53 rc6.d
-rw-r--r--. 1 root root 473 Oct  2  2020 rc.local
[root@localhost rc.d]# cd rc3.d
[root@localhost rc3.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 May 15 17:53 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 May 15 17:53 S10network -> ../init.d/network
[root@localhost rc3.d]#

三、通过 systemctl 添加服务自启动

在 Centos 7 之后,推荐通过 systemctl 来控制服务。

1、systemctl 服务的目录介绍

服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,建议不要修改。而要修改的位置应该放置于 /etc/systemd/system/ 目录内。

2、与启动服务相关的 systemctl 命令

以 sshd 服务为例,列出常用 systemctl 命令:

启动 sshd 服务systemctl start ssh.service
停止 sshd 服务systemctl stop ssh.service
查看 sshd 服务状态systemctl status ssh.service
重启 sshd 服务systemctl restart ssh.service
设置开机自启动systemctl enable ssh.service
禁止开机自启动systemctl disable ssh.service
查看所有已经启动的服务systemctl list-units --type=service
查看开机启动systemctl list-unit-files
重新加载配置文件systemctl daemon-reload

3、systemctl 启动服务编写

Centos 7 的服务 systemctl 脚本存放在:/usr/lib/systemd/目录下,有系统(system)和用户(user)之分,一般需要开机不登录就能运行的程序,就存放在/usr/lib/systemd/system/目录下。

每一个服务以. service 结尾,一般会分为 3 部分:[Unit]、[Service] 和 [Install],以 sshd 为实例如下:

[root@localhost ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

配置文件详解:

[Unit]主要是对这个服务的说明
After表示服务需要在 xx 服务启动之后执行无依赖
Before表示服务需要在 xx 服务启动之前执行无依赖
Wants弱依赖关系
Requires弱依赖关系xx 停止之后本服务也必须停止
[Service]是服务的一些具体运行参数的设置
ExecStart启动进程时执行的命令
ExecReload重启服务时执行的命令
ExecStop停止服务时执行的命令
ExecStartPre启动服务之前执行的命令
ExecStartPost启动服务之后执行的命令
ExecStopPost停止服务之后执行的命令
[Install]服务安装的相关设置,可设置为多用户的;
WantedBy

所有的启动设置之前,都可以加上一个 连词号(-),表示 "抑制错误", 即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使 /etc/sysconfig/sshd 文件不存在,也不会抛出错误。

type 参数说明:

simple(默认值)ExecStart 字段启动的进程为主进程
forkingExecStart 字段将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程
oneshot类似于 simple,但只执行一次,systemd 会等它执行完,才启动其他服务
dbus类似于 simple,但会等待 D-Bus 信号后启动
notify类似于 simple,启动结束后会发出通知信号,然后 systemd 再启动其他服务
idle类似于 simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

KillMode 参数说明:

control-group(默认值)当前控制组里面的所有子进程,都会被杀掉
process只杀主进程
mixed主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none没有进程会被杀掉,只是执行服务的 stop 命令。

Restart 参数说明:

no(默认值)退出后不会重启
on-success只有正常退出时(退出状态码为 0),才会重启
on-failure非正常退出时(退出状态码非 0),包括被信号终止和超时,才会重启
on-abnormal只有被信号终止和超时,才会重启
on-abort只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog超时退出,才会重启
always不管是什么退出原因,总是重启

修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。

重新加载配置文件

[root@localhost ~]# systemctl daemon-reload