Linux Systemd 配置开机自启

博文目录

文章目录


Systemd

Systemd 是一个用于启动、管理和监控 Linux 系统的初始化系统。它是许多现代 Linux 发行版中默认的初始化系统,取代了传统的 SysVinit 和 Upstart。

Systemd 的引入在 Linux 社区引起了一些争议,因为它与传统的初始化系统有很大的差异。然而,它的设计目标和功能使得管理和维护 Linux 系统变得更加高效和便捷。它已经成为许多主流 Linux 发行版的标准选择,并得到了广泛的应用和支持。

Systemd 的设计目标是提供更快的启动速度、更好的资源管理和更强大的系统监控功能。它引入了一些新的概念和功能,包括以下几个主要方面:

  • 单位(Unit):Systemd 使用单位(Unit)作为系统组件的基本单元。单位可以是服务(service)、套接字(socket)、设备(device)、挂载点(mount)等。每个单位都有一个对应的配置文件,用于描述其行为和依赖关系。
  • 依赖关系管理:Systemd 可以自动解决单位之间的依赖关系。每个单位可以指定其所依赖的其他单位,Systemd 将根据依赖关系自动按需启动或停止单位。
  • 并行启动:Systemd 支持并行启动系统单位,以提高系统的启动速度。它可以通过并行处理单位的依赖关系来最大程度地利用系统资源,加快启动过程。
  • 日志管理:Systemd 引入了 Journal(日志)系统,用于管理和存储系统日志。Journal 提供了结构化的日志记录和高效的日志查询功能,可以方便地检查系统的运行状态和故障排查。
  • 服务管理:Systemd 提供了强大的服务管理功能,可以启动、停止、重启和管理系统服务。它支持服务的自动重启、进程监控和故障恢复等功能,提高了系统的可靠性和可用性。
  • 控制接口:Systemd 提供了命令行工具和控制接口,用于管理和监控系统。通过 systemctl 命令可以查看和控制单位的状态,启动和停止服务,查看系统日志等。

最直观的体验就是, 通过 Systemd 配置程序开机启动会非常简单且统一, 体验非常好

操作方式

shell 复制代码
# 所有指令都可以省略 后缀 .service, 如 systemctl enable myapp
# 设置开机自启
systemctl enable myapp.service
# 取消开机自启
systemctl disable myapp.service
# 启动
systemctl start myapp
# 停止
systemctl stop myapp
# 重载
systemctl reload myapp

配置方式

需要创建一个 Systemd 服务单元文件,并在其中指定要在启动时运行的命令或程序。

据说, 通过二进制方式安装的程序才需要手动创建 Systemd 服务单元文件, 如 xxxx.service, 通过 yum 等安装的程序会自带该文件且会自动放到合适的位置, 可以直接执行 systemctl enable xxxx.service 来启用

创建服务单元文件:在 /etc/systemd/system//usr/lib/systemd/system 目录下创建一个以 .service 为后缀的服务单元文件,例如myapp.service。

编辑服务单元文件:使用文本编辑器打开刚刚创建的服务单元文件,并将以下内容粘贴到文件中:

shell 复制代码
[Unit]
Description=My App
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/path/to/your/app
Restart=always
User=your_username
Group=your_groupname
Environment="PATH=/usr/bin" "ANOTHER_ENV_VAR=some_value"

根据实际需求进行适当修改:

Description:服务的描述。

After:指定服务启动的依赖项。如果应用需要网络连接,请设置为 network.target。

ExecStart:指定要在启动时运行的命令或程序的完整路径。将/path/to/your/app替换为实际命令或程序的路径。

Restart:设置服务在出现问题时自动重启。

User和Group:指定运行服务的用户和组。将your_username和your_groupname替换为实际用户和组名。

Environment:设置环境变量。可以根据需要添加多个环境变量。

WantedBy:指定服务所属的运行级别。将 multi-user.target 替换为所需的运行级别。

保存并关闭文件。

重新加载Systemd配置:在终端中执行以下命令,以重新加载Systemd配置并启用新创建的服务单元文件:

shell 复制代码
systemctl daemon-reload  
systemctl enable myapp.service

这将使 Systemd 在启动时自动加载并运行指定的服务。

启动服务:

shell 复制代码
systemctl start myapp.service

检查服务状态:

shell 复制代码
systemctl status myapp.service

如果一切正常,应该看到服务的状态为 绿色 "active"。

现在,服务已经配置为开机自启。在下一次重启系统后,Systemd 将自动加载并运行该服务。

配置示例

shell 复制代码
# mysql
# https://dev.mysql.com/doc/mysql-secure-deployment-guide/8.0/en/secure-deployment-post-install.html

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Have mysqld write its state to the systemd notify socket
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS 

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false
shell 复制代码
# redis
[Unit]
Description=Redis Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/bin/redis.conf
Type=forking
PrivateTmp=true
shell 复制代码
# tomcat
[Unit]
Description=Tomcat 8.5.70
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/usr/local/bid/apache-tomcat-8.5.70/bin/startup.sh
Type=forking
PrivateTmp=true

参考

官方文档 MySQL 8.0 参考手册 - 在 Linux 安装 MySQL - 使用 Systemd 管理 MySQL - MySQL 8.0 安全部署向导 - 安装后操作 - 使用 Systemd 启动 MySQL Server

相关推荐
陌上花开࿈28 分钟前
调用第三方接口
java
Aileen_0v035 分钟前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
桂月二二2 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
小马爱打代码3 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
栗子~~3 小时前
idea 8年使用整理
java·ide·intellij-idea
2301_801483694 小时前
Maven核心概念
java·maven
007php0074 小时前
linux服务器上CentOS的yum和Ubuntu包管理工具apt区别与使用实战
linux·运维·服务器·ubuntu·centos·php·ai编程
Q_19284999064 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
djykkkkkk4 小时前
ubuntu编译遇到的问题
linux·运维·ubuntu