Linux 系统 Service 服务配置详解 Service 服务 服务单元前言在 Linux 生态系统中Systemd 被部署到大多数标准 Linux 发行版中作为默认初始化系统和服务管理器.service 文件是 Systemd 的单元配置文件用于定义服务的启动、停止、依赖关系等行为通过编写 .service 文件可以将自定义服务集成到系统服务管理中。而systemctl 是一个 Systemd 工具主要负责控制 Systemd 系统和服务管理器。检查 Systemd 是否安装检查系统中是否安装有 Systemd 并确定安装版本。打印如下表明当前系统已安装 Systemd。systemd219PAM AUDIT SELINUX IMA-APPARMORSMACK SYSVINIT UTMP LIBCRYPTSETUP GCRYPT GNUTLS ACL XZ LZ4-SECCOMPBLKID ELFUTILS KMOD IDNSystemd 的 Unit 文件Systemd 可以管理所有系统资源不同的资源统称为 Unit单位。在 Systemd 生态圈中Unit 文件统一了过去各种不同系统资源配置格式如服务的启动/停止、定时任务、设备自动挂载、网络配置、虚拟内存等而 Systemd 通过不同的文件后缀来区分这些配置文件。Systemd 支持的 12 种 Unit 文件类型automount用于控制自动挂载文件系统相当于 SysV-init 的 autofs 服务。device对于 /dev 目录下的设备主要用于定义设备之间的依赖关系。mount定义系统结构层次中的一个挂载点可以替代过去的 /etc/fstab 配置文件。path用于监控指定目录或文件的变化并触发其它 Unit 运行。scope这种 Unit 文件不是用户创建的而是 Systemd 运行时产生的描述一些系统服务的分组信息。service封装守护进程的启动、停止、重启和重载操作是最常见的一种 Unit 文件。slice用于表示一个 CGroup 的树通常用户不会自己创建这样的 Unit 文件。snapshot用于表示一个由 systemctl snapshot 命令创建的 Systemd Units 运行状态快照。socket监控来自于系统或网络的数据消息用于实现基于数据自动触发服务启动。swap定义一个用户做虚拟内存的交换分区。target用于对 Unit 文件进行逻辑分组引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用并提供更灵活的基于特定设备事件的启动方式。timer用于配置在特定时间触发的任务替代了 Crontab 的功能。Systemd 目录按照 Systemd 约定Unit 文件应该放置在指定的三个系统目录之一中优先级由上往下因此在三个目录中有同名文件时只有优先级最高的目录里的文件会被使用。/etc/systemd/system系统或用户自定义的配置文件。/run/systemd/system软件运行时生成的配置文件。/usr/lib/systemd/system系统或第三方软件安装时添加的配置文件。systemd 默认从目录 /etc/systemd/system/ 中读取配置文件但是大部分文件都是符号链接指向实际配置文件存放目录 /usr/lib/systemd/system/。Unit 和 TargetUnit 是 Systemd 管理系统资源的基本单元可以认为每个系统资源就是一个 Unit并使用一个 Unit 文件定义在 Unit 文件中需要包含相应服务的描述、属性以及需要运行的命令。Target 是 Systemd 中用于指定系统资源启动组的方式简单理解就是Target 是一个 Unit 组包含许多相关的 Unit启动某个 Target 的时候Systemd 就会启动里面所有的 Unit 类似于一个状态点启动某个 Target 就好比启动到某种状态。“”Systemd Service UnitUnit 文件结构以 sshd.service 为例文件结构如下# /usr/lib/systemd/system/sshd.service[Unit]DescriptionOpenSSH server daemonDocumentationman:sshd(8)man:sshd_config(5)Afternetwork.target sshd-keygen.serviceWantssshd-keygen.service[Service]TypenotifyEnvironmentFile/etc/sysconfig/sshdExecStart/usr/sbin/sshd-D$OPTIONSExecReload/bin/kill-HUP$MAINPIDKillModeprocessRestarton-failureRestartSec42s[Install]WantedBymulti-user.target示例二[Unit]DescriptionNingxia ApplicationAfternetwork.target mysql.service# 按需添加依赖服务[Service]Typeforking# 如果应用是后台进程使用 forkingUserrootWorkingDirectory/opt/project/ningxiaExecStart/bin/bash /opt/project/ningxia/run.sh restartRestartalways# 崩溃后自动重启RestartSec5s[Install]WantedBymulti-user.target如上所示Systemd 服务的 Unit 文件可以分为三个配置片段Unit 和 Install 所有 Unit 文件通用用于配置服务的描述、依赖和启动方式。Service 服务类型的 Unit 文件后缀为 .service特有的用于设置服务的管理和操作方法。[Unit]用来配置服务的描述信息、依赖关系和随系统启动的方式。Description服务的描述信息可以是任意字符串。Documentation指定服务的文档可以是一个或多个 URL 地址。After在指定依赖之后运行多项以空格分隔。仅影响启动顺序Before在指定依赖之前运行多项以空格分隔。仅影响启动顺序Wants设置 弱依赖 关系即所依赖服务启动失败或停止不会影响当前服务。Requires设置 强依赖 关系即所依赖服务启动失败或停止当前服务也必须退出。…依赖支持如下依赖条件描述network.target表示网络就绪network-online.target表示网络完全就绪(需要 NetworkManager-wait-online.service 支持)syslog.target表示系统日志服务就绪例postgresql.service 表示 postgresql 服务就绪[Service]定义服务的运行参数注意如下定义执行命令项均需使用绝对路径。Type指定服务启动类型支持类型如下类型描述simple默认值主进程由 ExecStart 启动后不后台化适用于前台程序。forking服务启动会派生到后台需配合 PIDFile 指定 PID 文件。onshot进程退出后服务视为完成适合执行一次性任务如初始化脚本。dbus服务通过 D-Bus 激活如桌面应用通信。notify服务通过 sd_notify 发送 READY1 信号告知启动完成需程序支持。idle若有其他任务执行完毕当前服务才会运行。User服务运行的用户应避免使用 root 建议创建专用用户。Group服务运行的用户组。PIDFile服务 PID 文件可不填如果填了服务需要生成 PID 文件否则不能启动。ExecStart服务启动命令。ExecStop服务停止命令。WorkingDirectory服务启动时的工作目录。Environment为服务指定环境变量。EnvironmentFile服务环境参数文件。Restart服务退出后的重启策略支持策略如下|策略 |描述||----|----||no |不重启默认值。||always |无论退出状态码如何都重启。||on-failure |推荐 仅在非正常退出状态码非 0时重启。||on-abnormal |仅在因信号终止或超时情况下重启。||on-abort |仅在未正常终止如SIGABRT时重启。||on-watchfdog |仅在看门狗超时情况下重启需配置 RuntimeWatchdogSec。|TimeoutStartSec启动服务时等待的秒数。TimeoutStopSec停止服务时等待的秒数。RestartSec服务退出后重启前的等待时间避免设置较短频繁重启导致系统负载过高。ExecReload服务重启的命令。ExecStartPre服务启动之前执行的命令。ExecStartPost服务启动之后执行的命令。ExecStopPost服务停止之后执行的命令。PrivateTmp是否给服务分配独立的临时空间。[Install]配置特定目标的 .target 文件用来使得服务在系统启动时自动运行。WantedBy定义依赖当前服务的模块在哪些目标target下会被激活当 Unit 激活时符号链接会放入 /etc/systemd/system/Target名.wants/ 目录中支持目标参数如下目标描述multi-user.target多用户命令行模式CentOS 7 默认运行级别 3。graphical.target图形界面模式运行级别 5。default.target系统默认目标通常是 multi-user.target 或 graphical.target。也可通过如下命令查看当前正在使用的运行目标。systemctl list-units--typetargetUNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Local Encrypted Volumes getty.target loaded active active Login Prompts local-fs-pre.target loaded active active Local File Systems(Pre)local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network.target loaded active active Network nfs-client.target loaded active active NFS client services paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems(Pre)remote-fs.target loaded active active Remote File Systems rpc_pipefs.target loaded active active rpc_pipefs.target rpcbind.target loaded active active RPC Port Mapper slices.target loaded active active Slices sockets.target loaded active active Sockets swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers LOADReflects whether the unit definition was properly loaded. ACTIVEThe high-level unit activation state, i.e. generalization of SUB. SUBThe low-level unit activation state, values depend on unit type.RequireBy定义依赖当前服务的模块在哪些目标target下会被激活当 Unit 激活时符号链接会放入 /etc/systemd/system/Target名.required/ 目录中。AlsoAlias当前 Unit 可用于启动的别名。创建服务使用 vim 编辑器打开并创建 myApp.service。vim/lib/systemd/system/myApp.service常用命令命令说明systemctl start启动服务systemctl stop停止服务systemctl restart重启服务systemctl status查看服务状态systemctl reload重载服务systemctl enable启用开机自启动systemctl disable禁用开机自启动journalctl -u查看服务日志journalctl 详解‌journalctl 是 Linux 系统中查看和管理日志的核心工具‌专门用来查询 systemd 日志系统收集的各种系统记录它能查啥日志‌- 所有系统日志‌内核消息、服务运行状态、用户程序输出都能查。‌- 集中化管理‌不用在多个日志文件里翻找一条命令就能看遍关键信息。‌‌‌常用命令命令说明journalctl查看所有日志从最早开始journalctl -b查看本次启动以来的所有日志journalctl -u service查看指定服务的日志如journalctl -u nginxjournalctl -f实时跟踪最新日志类似tail -fjournalctl -k查看内核日志dmesgjournalctl -p err按优先级过滤如err、warning、infojournalctl --since 2025-01-01 12:00:00查看指定时间之后的日志journalctl --until 2025-01-01 13:00:00查看指定时间之前的日志journalctl -u service --since 1 hour ago查看过去1小时内某服务日志journalctl -n 50显示最近的50行日志journalctl -o json-pretty以 JSON 格式输出日志journalctl --disk-usage查看日志占用磁盘空间journalctl --vacuum-size200M缩减日志占用空间至 200Mjournalctl --vacuum-time2weeks删除两周前的日志以释放空间还能用journalctl --disk-usage查看日志占用空间用–vacuum-time或–vacuum-size清理旧日志释放磁盘journalctl -xe 详解journalctl -xe 是 Linux 系统特别是使用 systemd 的发行版如 CentOS 7/8、RHEL、Ubuntu 等中用于‌排查系统故障和服务启动失败‌最常用的命令组合。它的核心作用是‌查看最新的系统日志并自动提供针对错误信息的详细解释和解决建议。‌以下是该命令两个参数的具体含义及作用详解参数拆解‌-x (catalog / 解释目录)‌‌作用‌增强日志的可读性。它会在标准的日志消息下方附加来自“消息目录”message catalog的解释性文本。‌价值‌如果日志中包含已知的错误代码或 systemd 单元状态变更-x 会显示该错误的含义、可能的原因以及官方提供的解决链接Support URL。这能帮助管理员快速理解报错背景而不仅仅是看到一堆代码。‌-e (pager-end / 跳至末尾)‌‌作用‌在使用分页器如 less查看日志时直接跳转到日志的‌最末尾‌即最新的部分。‌价值‌系统日志通常非常庞大。如果不加 -e你需要手动翻页很久才能看到最近发生的错误。加上 -e 后你可以立即看到刚刚发生的事件非常适合排查“刚才操作导致的问题”。典型使用场景当你执行某个服务重启或系统操作失败时系统通常会提示Seesystemctl status service.serviceandjournalctl -xefordetails.此时运行 journalctl -xe 可以‌聚焦最新错误‌直接定位到导致失败的那几条最新日志。‌获取上下文‌不仅看到报错行还能看到报错前后的依赖关系、启动流程日志。‌获得指引‌通过 -x 提供的额外信息了解是否是配置错误、权限问题或依赖服务未启动journalctl -xe 是系统管理员的“急救包”‌。当你遇到服务起不来、网络中断或系统报错时它是第一步应该执行的命令能帮你快速从海量日志中锁定最新的错误现场并获取官方解释