核心命令详解服务生命周期管理

# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务
sudo systemctl restart nginx
# 重载配置(不中断服务)
sudo systemctl reload nginx
# 查看服务状态
systemctl status nginx

status 输出包含关键信息:

 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2026-05-15 10:00:00 CST; 1h 30min ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 12.5M
     CGroup: /system.slice/nginx.service
             ├─1234 nginx: master process /usr/sbin/nginx -g daemon on;
             └─1235 nginx: worker process

解读:

开机自启动管理

# 启用开机启动
sudo systemctl enable nginx
# 禁用开机启动
sudo systemctl disable nginx
# 启用并立即启动(组合操作)
sudo systemctl enable --now nginx
# 禁用并立即停止
sudo systemctl disable --now nginx
# 查看是否开机启动
systemctl is-enabled nginx

enable 做了什么?它在

/etc/systemd/system/multi-user.target.wants/ 创建一个符号链接指向单元文件:

/etc/systemd/system/multi-user.target.wants/nginx.service
  → /lib/systemd/system/nginx.service

status命令详解_systemd服务生命周期管理_linux系统错误日志

系统启动到 multi-user.target 时,会自动启动所有 .wants 目录下的服务。

单元文件管理

# 查看单元文件内容
systemctl cat nginx
# 查看单元文件路径
systemctl status nginx | grep Loaded
# 编辑单元文件(自动创建 override)
sudo systemctl edit nginx --full
# 重新加载单元文件(修改后必须执行)
sudo systemctl daemon-reload
# 重置服务到默认配置
sudo systemctl reset-failed nginx

单元文件结构解析

一个典型的 .service 文件:

[Unit]
Description=My Application Service
Documentation=https://example.com/docs
After=network.target postgresql.service
Requires=postgresql.service
Wants=redis.service
[Service]
Type=notify
User=app
Group=app
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/server --config /etc/myapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
TimeoutStartSec=30
TimeoutStopSec=10
Environment=NODE_ENV=production
EnvironmentFile=/etc/myapp/env
# 资源限制
LimitNOFILE=65535
MemoryMax=2G
CPUQuota=200%
[Install]
WantedBy=multi-user.target

关键字 段详解

段:

段:

Type 选择的陷阱

# 错误:Type=simple 但进程会 daemonize
Type=simple
ExecStart=/usr/bin/redis-server /etc/redis.conf  # 默认会 fork
# 正确:要么改 Type,要么阻止 fork
Type=forking
# 或
ExecStart=/usr/bin/redis-server /etc/redis.conf --daemonize no

linux系统错误日志_systemd服务生命周期管理_status命令详解

如果 Type 和实际行为不匹配linux系统错误日志,systemd 会认为服务启动失败或无法正确跟踪进程。

日志与调试journalctl 集成

systemd 集成了 journaldlinux系统错误日志,所有服务日志统一管理:

# 查看服务日志
journalctl -u nginx
# 实时跟踪日志
journalctl -u nginx -f
# 查看最近 100 行
journalctl -u nginx -n 100
# 查看今天的日志
journalctl -u nginx --since today
# 查看时间范围
journalctl -u nginx --since "2026-05-15 10:00" --until "2026-05-15 12:00"
# 只看错误级别
journalctl -u nginx -p err

故障排查技巧

# 查看服务启动失败原因
systemctl status nginx -l
# 查看详细的服务属性
systemctl show nginx
# 检查服务依赖关系
systemctl list-dependencies nginx
# 检查反向依赖(谁依赖这个服务)
systemctl list-dependencies nginx --reverse
# 查看失败的服务
systemctl list-units --state=failed
# 检查服务是否被屏蔽
systemctl is-enabled nginx
# masked 表示被屏蔽,无法启动

高级用法资源控制

systemd 通过 cgroups 控制资源:

# 限制内存使用
systemctl set-property nginx MemoryMax=1G
# 限制 CPU 使用(200% = 2 核)
systemctl set-property nginx CPUQuota=200%
# 限制进程数
systemctl set-property nginx TasksMax=100

服务模板

linux系统错误日志_systemd服务生命周期管理_status命令详解

模板服务可以动态创建实例:

# /etc/systemd/system/app@.service
[Unit]
Description=App Instance %i
[Service]
Type=simple
ExecStart=/opt/app/server --port %i
Restart=always
[Install]
WantedBy=multi-user.target

使用:

# 启动实例 3000、3001
systemctl start app@3000
systemctl start app@3001
# 它们是独立的服务
systemctl status app@3000

%i 会被替换为实例名。

Socket 激活

按需启动服务,节省资源:

# /etc/systemd/system/app.socket
[Unit]
Description=App Socket
[Socket]
ListenStream=0.0.0.0:8080
[Install]
WantedBy=sockets.target

# /etc/systemd/system/app@.service
[Service]
ExecStart=/opt/app/server
StandardInput=socket

systemd服务生命周期管理_status命令详解_linux系统错误日志

系统监听端口,有连接时才启动服务。适合低频使用的服务。

实战案例:部署 Node.js 应用

完整的单元文件:

[Unit]
Description=Node.js API Server
After=network.target
[Service]
Type=simple
User=nodeapp
Group=nodeapp
WorkingDirectory=/opt/api-server
ExecStart=/usr/bin/node /opt/api-server/dist/index.js
Restart=on-failure
RestartSec=10
TimeoutStartSec=60
TimeoutStopSec=30
# 环境变量
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/opt/api-server/.env
# 资源限制
LimitNOFILE=65535
MemoryMax=2G
# 安全加固
NoNewPrivileges=yes
PrivateTmp=yes
# 日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=api-server
[Install]
WantedBy=multi-user.target

部署流程:

# 1. 复制单元文件
sudo cp api-server.service /etc/systemd/system/
# 2. 重载单元文件
sudo systemctl daemon-reload
# 3. 启用并启动
sudo systemctl enable --now api-server
# 4. 检查状态
systemctl status api-server
# 5. 查看日志
journalctl -u api-server -f

常见问题与解决服务启动失败linux web服务器,状态显示 masked

# 查看是否被屏蔽
systemctl is-enabled nginx
# 输出:masked
# 取消屏蔽
sudo systemctl unmask nginx

修改单元文件后不生效

# 必须重载
sudo systemctl daemon-reload
# 然后重启服务
sudo systemctl restart nginx

服务频繁重启

# 检查重启计数
systemctl show nginx -p NRestarts
# 检查重启原因
journalctl -u nginx -p err
# 调整重启策略
# 编辑单元文件,修改 Restart 和 RestartSec

服务卡在 activating 状态

可能原因:

Type 设置错误(simple vs forking)服务没有正确通知就绪(Type=notify 但没调用 sd_notify)启动脚本阻塞

# 查看详细状态
systemctl status nginx -l
# 查看进程树
systemd-cgls

systemctl 是 Linux 系统管理的必备技能。理解它的设计理念linux基础教程,掌握常用命令和调试技巧,能让服务部署和运维事半功倍。

相关工具: 进程监控速查 | 定时任务管理

systemd服务生命周期管理_status命令详解_linux系统错误日志

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复