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

相关推荐
徐*红16 分钟前
java 线程池
java·开发语言
尚学教辅学习资料16 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_8576363916 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
1 9 J18 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship19 分钟前
Java面试题(2)
java·开发语言
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
矛取矛求3 小时前
Linux如何更优质调节系统性能
linux
霖雨3 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java