本文以CentOS/RHEL为例子讲解怎么现代化的创建服务并设置开机自启动。本例子也适合Amazon Linux 2023、Ubuntu/Debian等其他使用systemd的现代化操作系统。
systemd 简介
systemd是一个系统和服务管理器,于 2010 年首次推出,用于取代传统的 System V 初始化系统。它旨在提高启动速度并更有效地管理系统服务。如今,systemd 是许多流行 Linux 发行版的默认初始化系统,包括 Ubuntu、Fedora 和 Red Hat Enterprise Linux(RHEL)。
几乎所有我们使用的流行的Linux发行版都是使用systemd来管理服务,比如当我在Ubuntu 22.04上安装了docker,我们可以这样管理
# 设置docker服务开机自启动
sudo systemctl enable docker
# 启动docker服务状态
sudo systemctl start docker
# 查看docker服务状态
systemctl status docker
不单是docker,绝大多数我们常用的软件(比如MySQL、MongoDB、RabbitMQ)都可以使用systemd来管理,是不是很方便~~
关于开机自启动问题
systemd推出的时间足够早而且得到了几乎全部Linux发行版的采用,目前我们使用的绝大多数Linux发行版,比如RedHat系(例如RHEL,CentOS,Fedora,Amazon Linux)、Debian系(Debian,Ubuntu,Raspberry Pi OS)等都已经使用systemd管理服务。以前我们在设置自己的服务开机启动的时候,我们一般喜欢把启动逻辑写在rc.local
里面,这在当前已经是非常落后而且不推荐的做法,因为上述的主流服务器操作系统已经彻底的弃用甚至移除了rc.local
下表是各种Linux发行版使用systemd的时间
发行版 | 引用 |
---|---|
Debian 8 | debian systemd - system and service manager |
Ubuntu 16.10 | Ubuntu 16.10 rc.local file does not exist |
CentOS7 / RHEL7 | Managing Services with systemd |
Fedora 17 | Fedora Packaging:Systemd |
当Linux使用systemd后,以前使用rc.local
管理服务自启动的方式开始被替代,弃用并最终删除。Amazon Linux 2023是AWS推出的基于Linux 6.1内核的云服务器操作系统,它吸收了RHEL/CentOS/Fedora的大量的最新的特性,并使用了systemd。一些客户由CentOS 7或者其他操作系统迁移到这个新系统时,会遇到自启动服务按照rc.local
的方式无法设置的问题。
为Linux设置开机自启动
我们以Nginx为例子(参考Linux 安装Nginx),讲解怎么使用systemd创建现代化的服务并设置开机自启动
编辑文件/usr/lib/systemd/system/nginx.service
,填入下面的内容:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
# 指定自己编译的nginx的可执行路径
ExecStartPre=/home/thinktik/envs/nginx/sbin/nginx -t
ExecStart=/home/thinktik/envs/nginx/sbin/nginx
ExecReload=/home/thinktik/envs/nginx/sbin/nginx -s reload
ExecStop=/home/thinktik/envs/nginx/sbin[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
更新systemd并启动服务,更新systemd并启动服务,如果遇到Failed at step EXEC spawning… Permission denied,很可能是SELinux处于安全原因阻止了服务的正常运行,这时关闭SElinux或者设置SElinux放行nginx服务再启动服务!
# 更新systemd
[root@thinkdev ~]# systemctl daemon-reload
# 启动nginx服务
[root@thinkdev ~]# systemctl start nginx.service
# 关闭nginx服务
[root@thinkdev ~]# systemctl stop nginx.service
[root@thinkdev ~]# systemctl start nginx.service
# 查看nginx服务状态
[root@thinkdev ~]# systemctl status nginx.service
参考:
- Managing Services with systemd
- Replacing rc.local in systemd Linux systems
- Systemd 入门教程:命令篇
- Systemd 入门教程:实战篇
- 学会爱上 systemd | Linux 中国
- NGINX systemd service file
- What is the correct substitute for rc.local in systemd instead of re-creating rc.local
- Debian 9 - rc.local deprecated, how to launch python at startup