【AI生成】systemd及systemctl介绍

systemd 介绍

systemd 是 Linux 系统中一套用于管理系统进程、服务、启动流程等的系统和服务管理器,旨在替代传统的 SysV init 系统,提供更高效、更灵活的系统管理方式。它目前已成为大多数主流 Linux 发行版(如 Ubuntu、CentOS、Fedora 等)的默认初始化系统。

systemd 的核心特点

  • 并行启动:传统 SysV init 按顺序启动服务,而 systemd 能并行启动多个服务,大幅缩短系统启动时间。
  • 按需激活:服务可在需要时(如被访问时)自动启动,而非必须在系统启动时就运行,节省系统资源。
  • 统一管理:通过 systemctl 命令统一管理系统服务、挂载点、设备、定时任务等,简化操作。
  • 依赖管理:清晰定义服务间的依赖关系,确保服务按正确顺序启动。
  • 日志集成:自带 journald 日志系统,集中管理系统日志,方便查询和分析。
  • 快照功能:可创建系统状态快照,便于恢复到之前的状态。

systemctl 介绍

systemctl 是 systemd 的主要命令行工具,用于管理系统服务、查看服务状态、控制系统运行级别等。它是操作 systemd 的核心接口。

systemctl 的常用功能及命令

  1. 服务管理

    • 启动服务:systemctl start <服务名>(如 systemctl start nginx
    • 停止服务:systemctl stop <服务名>
    • 重启服务:systemctl restart <服务名>
    • 重新加载配置(不中断服务):systemctl reload <服务名>
  2. 开机自启管理

    • 启用开机自启:systemctl enable <服务名>
    • 禁用开机自启:systemctl disable <服务名>
    • 查看是否开机自启:systemctl is-enabled <服务名>
  3. 状态查询

    • 查看单个服务状态:systemctl status <服务名>(显示运行状态、日志片段等)
    • 查看所有服务状态:systemctl list-units --type=service--type=service 限定为服务)
    • 查看失败的服务:systemctl --failed --type=service
  4. 系统控制

    • 关机: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 识别并管理服务:

  1. 重新加载配置(每次修改 .service 文件后需执行):

    sudo systemctl daemon-reload
    
  2. 启动服务并验证状态

    sudo systemctl start myapp
    sudo systemctl status myapp  # 查看状态,确认是否运行正常
    

    若状态显示 active (running),则启动成功。

  3. 设置开机自启

    sudo systemctl enable myapp
    
  4. 其他常用操作

    • 停止服务: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 管理的自定义服务,实现启动、停止、开机自启等功能。配置文件的灵活性允许根据程序特性调整参数,满足不同场景需求。

posted @ 2025-08-19 14:19  James_飏  阅读(42)  评论(2)    收藏  举报