1. 服务开机自启动概述
在Linux系统使用过程中,我们经常会遇到需要设置某些服务或程序在系统启动时自动启动的情况。
例如,我们可能希望web服务、数据库服务或者自定义脚本在服务器启动后自动运行。在Linux中,我们可以使用不同的方法来实现这一点。
常见的方法包括:
- 使用systemd
- 使用SysVinit
- 使用supervisor
参考文档:
2. systemd配置服务开机自启动
在现代的Linux发行版中,如Ubuntu 16.04及更高版本、CentOS 7及更高版本,已经采用了systemd来控制系统服务。
整个配置过程,只是需要创建一个systemd服务文件。
1 | cd /etc/systemd/system/ |
内容如下:
1 | [Unit] |
systemd服务文件调用的 /root/script.sh 脚本内容为:
1 |
|
配置好systemd服务文件后,我们就可以使用以下命令来控制服务:
1 | systemctl start myservice # 启动服务 |
如果删除了 myservice.service 文件,需要重新加载systemd单元配置
1 | systemctl daemon-reload |
3. systemd服务配置文件说明
3.1. [Unit]块
此区块用于设定服务的说明、文档链接等信息,以及定义依赖关系。
- Description:用于给出此服务的简短描述。
- Documentation:指定文档的链接,通常是man手册页面或者http/https的跳转界面。
- After/Before:定义了服务启动的顺序。一般来说,After=network.target表示在网络服务之后再启动。
3.2. [Service]块
定义启动服务的运行模式和对应的命令。
- Type:定义了服务的启动模式,一般有以下选项。
- oneshot:服务启动后,在设定的ExecStart指令全部运行完后服务状态跳转为activating
- simple(默认):ExecStart指令运行后,立即跳转为activated
- forking:当ExecStart指定的主程序结束时,服务跳转为activated
- restart:当service状态转为deactivating,且Cause由Watchdog引发时,立即重启服务
- notify:当主程序通过sd_notify通知(通过/lib/systemd/notify接口)systemd服务进入active状态时,服务跳转为activated
- ExecStartPre:启动服务的前置命令,比如启动stunnel前需要创建一个目录
/usr/bin/mkdir -p /var/run/stunnel/
- ExecStart:表示启动服务要运行的命令。
- ExecStop:表示停止服务要运行的命令。
- ExecReload:表示重新加载服务要运行的命令。
- Restart:服务重启配置。
- no:这是默认值。Service发生任何导致其退出的事情,systemd都不会尝试重启它。
- on-success:只有当service正常退出时,即退出状态码为0,systemd才会尝试重启。像被信号杀死或段错误导致的非正常退出等情况,都不会触发重启。
- on-failure:当service以非正常方式或被信号杀死且没有设置Service的”SuccessExitStatus”时,即退出状态码非零,systemd才会尝试重启。但由于指定的重启指令(ExecStop=、ExecStopPost=, 以及 TimeoutStopSec=)而退出时不会被重启。
- on-abnormal:当service以任何被信号杀死、dump核心或超时状态退出时,systemd会尝试重启。
- on-abort:当Service的主进程退出,且导致此次退出的信号名字为 SIGABRT,systemd才会尝试重启这个Service。
- on-watchdog:当服务未发送 “keep-alive”消息至systemd造成看门狗超时时,systemd会尝试重启。
- always:无论服务以何种状态退出,systemd都会尝试重新启动它(除非手动systemctl stop)。
- RestartSec:尝试重启的时间间隔,比如 60s
- WorkingDirectory:工作目录,相当于cd进入这个目录再执行命令
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
3.3. [Install]块
定义了服务的安装目标,即是否要将此服务在某状态开机时就启动。
- WantedBy:此服务被硬性要求在WantedBy指定的服务启动后才启动。
- RequiredBy:此服务被强硬要求在RequiredBy指定的服务启动后才启动。
4. systemd配置示例
Nginx开机自启动配置方法,参考文档《CentOS7中安装配置Nginx》
Harbor开机自启动配置方法,参考文档《Harbor入门篇》
5. systemd服务配置服务检查并重启
配置定时任务:
1 | */5 * * * * systemctl is-active --quiet your-service.service || systemctl start your-service.service |
6. SysVinit配置服务开机自启动
尽管systemd已经在许多发行版中成为了默认的服务管理工具,但也有一些发行版或旧版本的系统仍在使用SysVinit。
在基于SysVinit的系统中,我们可以创建一个启动脚本并将其链接到相应的runlevel目录。
1、创建一个启动脚本 myservice
1 | cd /etc/init.d |
myservice内容为:
1 |
|
2、链接到runlevel目录
1 | chkconfig --add myservice |
可以看到,/etc/rc[0~6].d
目录中都创建了一个 myservice 的链接。
3、检查服务状态
1 | chkconfig --list myservice |
看到内容为:
1 | myservice 0:关 1:关 2:关 3:开 4:开 5:开 6:关 |
这个表示服务myservice在不同的系统运行级别(runlevel)下的开启或关闭状态。在Linux系统中,总共有7个运行级别,编号为0到6,每个级别都对应着不同的系统状态,其中:
- 0: 关闭系统
- 1: 单用户模式(single-user mode)
- 2: 多用户模式,不含NFS(multi-user mode without NFS)
- 3: 完全的多用户模式(multi-user mode with networking)
- 4: 用户可自定义的运行级别
- 5: 图形界面模式(multi-user mode with GUI)
- 6: 重启系统
所以,myservice 0:关 1:关 2:关 3:开 4:开 5:开 6:关
的意思就是在系统处于运行级别3、4、5时,myservice服务会自动启动;在运行级别0、1、2、6时,myservice服务不会启动。
4、设置所有level状态下服务都能自动启动
1 | chkconfig --level 123456 myservice on |
在包含systemd的系统中,会自动转成systemd服务文件。
7. SysVinit配置示例
MySQL开机自启动配置方法,参考文档《CentOS7中安装配置MySQL》
8. rc.local配置服务开机自启动
除了使用chkconfig命令,我们还可以把脚本的启动命令直接写入 /etc/rc.local
文件中,那么开机时也会自动启动。
这种配置服务开启自启动的方式,也可以归类于SysVinit。
rc.local配置开机自启动示例:《使用frp进行内网穿透》
9. supervisor配置服务开机自启动
supervisor安装配置方法,参考文档《Linux安装配置Supervisor》
supervisor配置开机自启动示例:《CentOS7中安装配置Tomcat》