一、系统服务管理核心:systemd 与 systemctl(现代 Linux 必备)
1. 为什么要用 systemd?
systemd 是目前 Ubuntu、CentOS、Fedora 等主流 Linux 发行版的默认初始化系统,替代了传统的 SysV init。它的优势很直观:
-
并行启动服务,开机速度比传统方式快 50% 以上;
-
按需激活服务,不用一直占用系统资源;
-
统一管理服务、挂载点、定时任务,不用记多个命令;
-
自带日志系统(journald),排查问题更方便。
简单说,systemd 是服务管理的 “后台框架”,systemctl 是操作这个框架的 “命令行工具” —— 就像电影院的放映机和遥控器,前者负责运转,后者负责操控。
2. systemctl 高频命令(实战必备)
(1)服务启停与重启
\ 启动服务(示例:Nginx)
systemctl start nginx
\ 停止服务
systemctl stop nginx
\ 重启服务(先停后启,适合修改配置后)
systemctl restart nginx
\ 重载配置(不中断服务,推荐优先用)
systemctl reload nginx
\ 不确定服务是否支持reload?用这个自动适配
systemctl reload-or-restart nginx
(2)开机自启管理
生产环境必备功能,避免服务器重启后服务失联:
\ 启用开机自启
systemctl enable nginx
\ 禁用开机自启
systemctl disable nginx
\ 启用并立即启动(一步到位)
systemctl enable --now nginx
\ 检查是否开机自启(输出enabled/disabled)
systemctl is-enabled nginx
(3)服务状态查询
排查服务故障的核心命令,能看到运行状态、进程 ID、最近日志:
\ 查看单个服务详情(最常用)
systemctl status nginx
\ 只判断是否在运行(输出active/inactive)
systemctl is-active nginx
\ 查看所有正在运行的服务
systemctl list-units --type=service
\ 查看所有失败的服务(快速定位问题)
systemctl --failed --type=service
(4)自定义服务配置(进阶实操)
如果需要将自己的应用(如 Java 程序、脚本)注册为系统服务,按以下步骤:
- 创建服务配置文件(优先级:/etc/systemd/system/ > /usr/lib/systemd/system/):
vim /etc/systemd/system/myapp.service
- 写入配置(以 Spring Boot 应用为例):
\[Unit]
Description=我的Spring Boot应用 服务描述
After=network.target 网络启动后再启动本服务
Wants=mysql.service 弱依赖MySQL,MySQL启动失败不影响本服务
\[Service]
User=appuser 运行服务的用户
WorkingDirectory=/opt/myapp 应用目录
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar app.jar 启动命令
Restart=always 进程退出时自动重启
RestartSec=5 重启间隔5秒
PrivateTmp=true 独立临时目录,提高安全性
\[Install]
WantedBy=multi-user.target 多用户模式下生效(类似传统运行级别3)
- 生效配置并启动:
systemctl daemon-reload 修改配置后必须执行
systemctl enable --now myapp
systemctl status myapp 验证状态
3. 日志查询(搭配 journald)
systemd 集成的日志系统,不用单独装 rsyslog:
\ 实时查看服务日志(类似tail -f)
journalctl -u myapp -f
\ 查看最近200条日志
journalctl -u myapp -n 200 --no-pager
\ 按时间筛选(2025年11月22日之后的日志)
journalctl -u myapp --since "2025-11-22"
二、进程查询与控制:ps/top/kill 命令实操
1. ps 命令:静态查看进程(快照式)
ps(Process Status)用于查看当前系统的进程快照,适合快速排查特定进程。
常用参数组合:
| 命令 | 功能 | 适用场景 |
|---|---|---|
ps -ef | 查看所有进程的详细信息(用户、PID、父进程 ID 等) | 全局排查进程 |
ps -p 1234 | 查看指定 PID(1234)的进程 | 验证某个进程是否运行 |
ps -C nginx | 按进程名筛选(如 nginx) | 快速找到目标服务进程 |
ps -ef --sort=-%cpu | 按 CPU 使用率倒序排列 | 定位 CPU 占用高的进程 |
ps -ef --sort=-%mem | 按内存使用率倒序排列 | 定位内存泄漏进程 |
输出字段解析(以 ps -ef 为例):
-
PID:进程唯一 ID(操作进程的核心标识);
-
PPID:父进程 ID(谁启动了这个进程);
-
UID:进程所属用户(如 root、appuser);
-
C:CPU 使用率(最近统计周期的占比);
-
STIME:进程启动时间;
-
CMD:启动进程的命令(如 /java、/usr/sbin/nginx)。
示例:查找 nginx 进程并查看详细信息
ps -ef | grep nginx
2. top 命令:动态监控进程(实时更新)
top 是 “动态版 ps”,默认每 3 秒更新一次,适合实时观察系统资源占用情况。
基础用法:
\ 启动top(默认全局监控)
top
\ 每2秒更新一次,更新5次后退出
top -d 2 -n 5
\ 只监控指定用户(如appuser)的进程
top -u appuser
\ 只监控PID为1234和5678的进程
top -p 1234,5678
交互操作(启动 top 后按以下按键):
-
q:退出 top; -
k:终止进程(输入 PID 后按回车,再输入 9 强制终止); -
r:调整进程优先级(输入 PID 和新优先级,范围 - 20~19,-20 最高); -
u:切换到指定用户的进程视图; -
f:自定义显示字段(如添加 / 删除内存占用、进程状态等); -
o:按指定字段排序(如按 CPU 排序选 “% CPU”)。
顶部状态栏解读(关键信息):
-
load average:1/5/15 分钟系统负载(如 0.09、0.06、0.10),负载值超过 CPU 核心数则可能卡顿;
-
%Cpu(s):us(用户空间占用)、sy(内核空间占用)、id(空闲率),id 越高资源越充裕;
-
MiB Mem:物理内存总大小、已用、空闲、缓存占用情况。
3. kill 命令:终止进程(强制结束异常进程)
kill 通过 PID 向进程发送信号,常用信号如下:
-
15(默认):优雅终止(进程清理资源后退出); -
9:强制终止(立即杀死进程,不清理资源,用于无响应进程); -
1:重启进程(部分服务支持)。
常用命令:
\ 优雅终止PID为1234的进程
kill 1234
\ 强制终止PID为1234的进程(推荐优先用这个)
kill -9 1234
\ 终止所有nginx进程(结合ps使用)
kill -9 \$(ps -ef | grep nginx | grep -v grep | awk '{print \$2}')
\ 查看所有支持的信号
kill -l
三、后台进程与守护进程:区别与实操
1. 核心区别
| 类型 | 后台进程 | 守护进程 |
|---|---|---|
| 父进程 | 终端进程(如 bash) | init 进程(PID=1,systemd 就是 init 进程) |
| 生命周期 | 终端关闭则进程退出 | 不受终端影响,系统关机才退出 |
| 终端关联 | 依赖启动终端 | 无终端关联(TTY 显示 “?”) |
| 适用场景 | 临时后台运行(如长时间下载) | 长期运行的服务(如 Nginx、MySQL) |
2. 后台进程操作(临时任务)
(1)直接后台运行
在命令末尾加&,进程会在后台运行,终端可继续操作:
\ 后台运行wget下载(终端关闭则下载停止)
wget https://example.com/largefile.iso &
(2)查看后台进程
\ 查看当前终端的后台进程(jobs编号≠PID)
jobs
\ 显示后台进程的PID(推荐用这个)
ps -ef | grep \[命令关键词]
(3)前后台切换
\ 将后台进程切换到前台(%1表示jobs编号为1的进程)
fg %1
\ 将前台进程切换到后台(先按Ctrl+Z暂停,再执行bg)
Ctrl+Z
bg %1
(4)避免终端关闭导致进程退出
用nohup命令(no hang up,不挂断),进程会忽略终端关闭信号:
\ 后台运行脚本,输出日志到nohup.out
nohup sh myscript.sh &
\ 自定义日志输出路径
nohup sh myscript.sh > /var/log/myscript.log 2>&1 &
3. 守护进程操作(长期服务)
守护进程是 “脱离终端的后台进程”,最推荐的方式是通过systemd 注册为系统服务(前文 “自定义服务配置” 已讲),此外也可以用nohup + &模拟,但稳定性不如 systemd。
实操案例:将 Python 脚本注册为守护进程
- 编写脚本(/opt/script/monitor.py):
import time
while True:
  with open('/var/log/monitor.log', 'a') as f:
  f.write(f"\[{time.strftime('%Y-%m-%d %H:%M:%S')}] 服务运行中...\n")
  time.sleep(60) 每分钟输出一次日志
- 创建 systemd 服务文件(/etc/systemd/system/monitor.service):
\[Unit]
Description=自定义监控脚本守护进程
After=network.target
\[Service]
User=root
WorkingDirectory=/opt/script
ExecStart=/usr/bin/python3 monitor.py
Restart=always
RestartSec=5
\[Install]
WantedBy=multi-user.target
- 启动并设置开机自启:
systemctl daemon-reload
systemctl enable --now monitor
systemctl status monitor
\ 查看日志验证
tail -f /var/log/monitor.log
四、常见问题排查(避坑指南)
-
systemctl 启动服务失败:用
systemctl status 服务名查看日志,重点看 “Failed” 提示,常见原因:配置文件语法错误、依赖服务未启动、权限不足。 -
kill 不掉进程:用
ps -ef | grep 进程名确认 PID 是否正确,若提示 “operation not permitted”,加sudo(如sudo kill -9 1234)。 -
后台进程终端关闭后退出:改用
nohup + &或注册为 systemd 服务,避免直接用&。 -
top 显示 CPU 使用率 100%:按
P排序 CPU 占用,找到高占用进程,用kill -9 PID终止,或排查程序是否有死循环。
(注:文档部分内容可能由 AI 生成)