核心命令详解服务生命周期管理
# 启动服务
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

系统启动到 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

如果 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
服务模板

模板服务可以动态创建实例:
# /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

系统监听端口,有连接时才启动服务。适合低频使用的服务。
实战案例:部署 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基础教程,掌握常用命令和调试技巧,能让服务部署和运维事半功倍。
相关工具: 进程监控速查 | 定时任务管理

