Linux 设置开机自启动

2023年 8月 15日 34.2k 0

本文以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

image

参考:

  • 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

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论