现在大部分的Linux发布版本开机第一个程序都从init换成了systemd这种启动方式。systemd是靠管理unit的方式来控制开机服务、开机级别等功能。

系统服务:开机不登录就能运行的程序(常用于开机自启)。
用户服务:需要登录以后才能运行的程序。

下面是配置文件说明:

[Unit]     区块:启动顺序与依赖关系

  • Description  字段:给出当前服务的简单描述
  • Documentation 字段:给出文档位置
  • After     字段:设置本服务在哪个服务启动后随之启动
  • Before    字段:定义本服务应该在哪些服务启动之前启动
  • Wants    字段:“弱依赖”关系,即如果所依赖服务启动失败或停止运行,不影响本服务继续执行
  • Requires   字段:“强依赖”关系,即如果所依赖服务启动失败或异常提出,那么本服务也必须退出

[Service]区块:启动行为

  • ExecStart   字段:定义启动进程时执行的命令
  • ExecReload  字段:重启服务时执行的命令
  • ExecStop   字段:停止服务时执行的命令
  • ExecStartPre  字段:启动服务之前执行的命令
  • ExecStartPost 字段:启动服务之后执行的命令
  • ExecStopPost 字段:停止服务之后执行的命令

    所有的启动设置之前都可以加一个连词号(-),表示“抑制错误”,即发生错误的时候,不影响其他命令的执行。
    比如EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。
    [Service]中的启动、重启、停止命令要求全部使用绝对路径!
  • type      字段:定义启动类型

    • simple(默认值) :ExecStart字段启动的进程为主进程
    • fork      :ExecStart字段将以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),包括被信号终止和超时,才会重启。使用systemctl stop命令,不会重启
    • on-abnorma :只有被信号终止和超时,才会重启
    • on-abort   :只有在收到没有捕捉到的信号终止时,才会重启
    • on-watchdog :超时退出,才会重启
    • always    :总是重启
  • RestartSec  字段:在重启服务前,需要等待的秒数

[Install]区块:如何安装配置文件,怎样做到开机自启

  • WantedBy字段 :表示服务所在的Target
  • Target字段   :含义是服务组,表示一组服务

    WantedBy=multi-user.target指的是:服务所在的Target是multi-user.target
    这个设置非常重要,因为执行systemctl enable xxx.service命令时,xxx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中
    systemd有默认的启动Target
    systemctl get-default
    #输出multi-user.target
    上面的结果表示,默认的启动Target是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能够设置开机启动的原因。
    使用Target的时候,systemctl list-dependencies命令和systemctl isolate命令也很有有
    #查看multi-user.target包含的所有服务
    systemctl list-dependencies multi-user.target
    
    #切换到另一个target
    #shutdown.target就是关机状态
    systemctl isolate shutdown.target
    
    #一般来说常用到的Target有两个:
    #multi-user.target:表示多用户命令行的状态
    #graphical.target:表示图形用户状态,它依赖于multi-user.target

    下面来看看怎么注册服务

    每一个Unit(服务)都有一个配置文件,告诉systemd怎么启动这个unit
    systemd默认从目录/etc/systemd/system/中读取配置文件
    但是里面存放的大多都是符号链接,指向目录/usr/lib/systemd/system,真正的配置文件存放在后者。systemctl enable 命令则是用于在上面两个目录之间建立符号链接关系
    systemctl enable xxx.service
    #等同于
    systemctl -s '/usr/lib/systemd/system/xxx.service' '/etc/systemd/system/multi-user.target.wants/xxxservice'
    如果配置文件设置了开机启动,systemctl enable 相当于激活开机启动
    与之对应的,systemctl disable 命令用于在两个目录之间撤销符号链接关系,相当于撤销开机启动
    systemctl disable xxx.service

    看看这个例子:
    屏幕截图 2023-03-16 111615.png

配置nginx开机启动服务:

  • 在/etc/systemd/system/目录下新建nginx.service文件:

    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=network.target remote-fs.target nss-lookup.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/bin/kill -s QUIT$MAINPID
    PrivateTmp=false
    [Install]
    WantedBy=multi-user.target
    重载系统服务:systemctl daemon-reload
    设置开机启动:systemctl enable xxx.service
    启动服务:systemctl start xxx.service
    停止服务:systemctl stop xxx.service
    重启服务:systemctl restart xxx.service

修改完配置文件,记得要重载配置文件(source)

当我们想要立刻看到修改后的效果,但又不愿与重启,这时候就得使用source使得配置文件立即生效
#方式1:
source /etc/profile
#方式2:
. /etc/profile
# source命令也称为“点命令”,使用点符号(.)代替没问题

参考链接:
https://blog.csdn.net/qq_45164331/article/details/122410141
https://blog.csdn.net/lcczpp/article/details/105534329