设置Linux开机启动服务
现在大部分的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有默认的启动Targetsystemctl 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
看看这个例子:
配置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