【AI生成】systemd及systemctl介绍
systemd 介绍
systemd 是 Linux 系统中一套用于管理系统进程、服务、启动流程等的系统和服务管理器,旨在替代传统的 SysV init 系统,提供更高效、更灵活的系统管理方式。它目前已成为大多数主流 Linux 发行版(如 Ubuntu、CentOS、Fedora 等)的默认初始化系统。
systemd 的核心特点
- 并行启动:传统 SysV init 按顺序启动服务,而 systemd 能并行启动多个服务,大幅缩短系统启动时间。
- 按需激活:服务可在需要时(如被访问时)自动启动,而非必须在系统启动时就运行,节省系统资源。
- 统一管理:通过
systemctl
命令统一管理系统服务、挂载点、设备、定时任务等,简化操作。 - 依赖管理:清晰定义服务间的依赖关系,确保服务按正确顺序启动。
- 日志集成:自带
journald
日志系统,集中管理系统日志,方便查询和分析。 - 快照功能:可创建系统状态快照,便于恢复到之前的状态。
systemctl 介绍
systemctl
是 systemd 的主要命令行工具,用于管理系统服务、查看服务状态、控制系统运行级别等。它是操作 systemd 的核心接口。
systemctl 的常用功能及命令
-
服务管理
- 启动服务:
systemctl start <服务名>
(如systemctl start nginx
) - 停止服务:
systemctl stop <服务名>
- 重启服务:
systemctl restart <服务名>
- 重新加载配置(不中断服务):
systemctl reload <服务名>
- 启动服务:
-
开机自启管理
- 启用开机自启:
systemctl enable <服务名>
- 禁用开机自启:
systemctl disable <服务名>
- 查看是否开机自启:
systemctl is-enabled <服务名>
- 启用开机自启:
-
状态查询
- 查看单个服务状态:
systemctl status <服务名>
(显示运行状态、日志片段等) - 查看所有服务状态:
systemctl list-units --type=service
(--type=service
限定为服务) - 查看失败的服务:
systemctl --failed --type=service
- 查看单个服务状态:
-
系统控制
- 关机:
systemctl poweroff
- 重启:
systemctl reboot
- 进入救援模式(单用户模式):
systemctl rescue
- 查看系统运行级别:
systemctl get-default
(如multi-user.target
对应命令行模式,graphical.target
对应图形界面)
- 关机:
补充说明
- systemd 中,服务以“单元(unit)”形式存在,服务单元的配置文件通常位于
/usr/lib/systemd/system/
或/etc/systemd/system/
,文件名格式为<服务名>.service
。 - 修改服务配置后,需执行
systemctl daemon-reload
使配置生效。
通过 systemd 和 systemctl,Linux 系统的服务管理和启动流程更加高效、可控,是现代 Linux 系统的核心组件之一。
systemd 服务单元配置文件介绍及自定义服务配置指南
一、服务单元配置文件基础
在 systemd 中,所有被管理的资源(如服务、挂载点、定时任务等)都被称为“单元(unit)”,其中服务单元(.service
) 用于定义系统服务的启动规则、运行方式等。其配置文件是 systemd 管理服务的核心依据。
1. 配置文件存放路径
服务单元配置文件的默认路径有两个,优先级不同:
/usr/lib/systemd/system/
:系统预装服务的配置文件(由软件包管理工具维护,不建议手动修改)。/etc/systemd/system/
:用户自定义或修改的服务配置文件(优先级更高,会覆盖系统默认配置)。
文件名格式为 <服务名>.service
(如 myapp.service
),服务名需唯一。
2. 配置文件结构
配置文件采用“键值对”格式,按功能分为多个区块(Section),每个区块用 [区块名]
标识。核心区块包括:
区块名 | 作用说明 |
---|---|
[Unit] |
定义服务的元数据(如描述、依赖关系、启动顺序等),不涉及服务本身的运行逻辑。 |
[Service] |
核心区块,配置服务的启动命令、运行用户、重启策略等具体运行参数。 |
[Install] |
定义服务的安装信息(如开机自启时依赖的目标单元)。 |
3. 常用配置项详解
以下是各区块中最常用的配置项(以服务为例):
-
[Unit]
区块:Description
:服务的简短描述(如Description=My Custom Application
)。After
:定义服务启动的依赖顺序(如After=network.target
表示在网络服务启动后再启动当前服务)。Requires
:强依赖关系,若依赖的服务启动失败,当前服务也会启动失败(如Requires=mysql.service
)。Wants
:弱依赖关系,依赖的服务启动失败不影响当前服务(比Requires
更常用)。
-
[Service]
区块:Type
:服务类型,决定启动方式(常用值:simple
(默认,启动命令是主进程)、forking
(启动后会 fork 子进程,父进程退出))。ExecStart
:启动服务的命令(必填,如ExecStart=/usr/local/myapp/bin/start.sh
)。ExecStop
:停止服务的命令(如ExecStop=/usr/local/myapp/bin/stop.sh
)。ExecReload
:重新加载配置的命令(如ExecReload=/bin/kill -HUP $MAINPID
,$MAINPID
是服务主进程 ID)。User
/Group
:指定服务运行的用户/组(默认 root,建议降权为普通用户,如User=appuser
)。Restart
:服务退出后的重启策略(常用值:always
(总是重启)、on-failure
(失败时重启)、no
(不重启))。WorkingDirectory
:服务运行的工作目录(如WorkingDirectory=/usr/local/myapp
)。Environment
:设置环境变量(如Environment="PATH=/usr/local/bin:$PATH"
)。
-
[Install]
区块:WantedBy
:指定服务被启用(开机自启)时依赖的目标单元(如WantedBy=multi-user.target
,表示在多用户命令行模式下启动)。
二、自定义一个 systemctl 管理的服务
假设我们需要管理一个名为 myapp
的后台程序(可执行文件路径为 /usr/local/myapp/myapp
),步骤如下:
1. 创建服务配置文件
在 /etc/systemd/system/
目录下创建文件 myapp.service
(文件名即服务名):
[Unit]
Description=My Custom Application
After=network.target # 网络启动后再启动 myapp
Wants=network.target # 弱依赖网络服务
[Service]
Type=simple # 启动命令直接运行主进程
User=appuser # 以普通用户 appuser 运行(需提前创建:useradd -r appuser)
Group=appuser
WorkingDirectory=/usr/local/myapp # 工作目录
Environment="APP_PORT=8080" # 环境变量:端口 8080
ExecStart=/usr/local/myapp/myapp # 启动命令
ExecStop=/bin/kill -TERM $MAINPID # 停止命令(发送终止信号)
Restart=on-failure # 运行失败时自动重启
RestartSec=5 # 重启间隔 5 秒
[Install]
WantedBy=multi-user.target # 开机自启时依赖多用户目标
2. 配置说明
Type=simple
:适用于前台运行的程序(若程序启动后会后台运行,需改为Type=forking
,并确保主进程退出)。Restart=on-failure
:避免程序意外崩溃后终止,提高可用性。User=appuser
:通过降权运行减少安全风险(若程序需要 root 权限可省略)。
3. 生效并管理服务
配置文件创建后,执行以下命令使 systemd 识别并管理服务:
-
重新加载配置(每次修改
.service
文件后需执行):sudo systemctl daemon-reload
-
启动服务并验证状态:
sudo systemctl start myapp sudo systemctl status myapp # 查看状态,确认是否运行正常
若状态显示
active (running)
,则启动成功。 -
设置开机自启:
sudo systemctl enable myapp
-
其他常用操作:
- 停止服务:
sudo systemctl stop myapp
- 重启服务:
sudo systemctl restart myapp
- 查看日志(结合 journald):
sudo journalctl -u myapp -f
(-f
实时跟踪日志)
- 停止服务:
4. 调试技巧
- 若服务启动失败,通过
systemctl status myapp
查看错误信息(通常在日志片段中)。 - 检查配置文件语法错误:
sudo systemctl cat myapp
(若格式错误会提示)。 - 若程序依赖特定环境,可在
[Service]
中通过EnvironmentFile
加载环境变量文件(如EnvironmentFile=/etc/myapp.conf
)。
通过以上步骤,即可创建一个由 systemctl
管理的自定义服务,实现启动、停止、开机自启等功能。配置文件的灵活性允许根据程序特性调整参数,满足不同场景需求。