适用:systemd 系统(麒麟 / UOS / Ubuntu / openEuler 都是) 耗时:约 30 分钟 前置:E1(懂权限)
第一季的 D7 教你"看日志",这一篇教你**“管进程”**。
装好的软件点了没反应、服务器重启后服务没起来、某个程序把 CPU 吃满——这三件事背后是同一套东西。
一、先分清「程序」「进程」「服务」
这三个词经常被混着用,其实不一样:
| 词 | 是什么 | 类比 |
|---|---|---|
| 程序 | 硬盘上的可执行文件 | 菜谱 |
| 进程 | 正在跑的那个程序实例 | 按菜谱在做的那道菜 |
| 服务(守护进程) | 在后台一直跑、不需要人盯着的进程 | 后厨常驻的炉子 |
一个程序可以有多个进程。 比如你开三个终端,就有三个 bash 进程。
服务的特点:没有窗口、不看屏幕、开机自动起、挂了能自动重启。
二、看进程:五个命令
1. ps aux —— 拍一张快照
ps aux
输出列的含义:
| 列 | 意思 |
|---|---|
USER | 谁在跑 |
PID | 进程号(最重要,认人靠它) |
%CPU / %MEM | 占多少 CPU / 内存 |
STAT | 状态(R 运行、S 睡眠、Z 僵尸、D 不可中断) |
COMMAND | 命令行 |
最常用的是配 grep:
ps aux | grep nginx # 找 nginx 进程
ps aux | grep -v grep | grep nginx # 去掉 grep 自己那一行
2. top —— 实时的
top
里头的操作:
M按内存排序P按 CPU 排序k杀掉某个 PID(会让你输 PID)q退出
3. htop —— 更好看的 top(推荐装)
sudo apt install htop # Debian 系
sudo dnf install htop # RPM 系
htop
能用方向键选、能 F9 杀、能 F6 排序,比 top 友好得多。
4. pgrep / pkill —— 按名字找/杀
pgrep nginx # 只输出 PID
pgrep -a nginx # 输出 PID + 完整命令行(更有用)
pkill nginx # 按名字杀
⚠️
pkill -f "关键词"要小心:-f匹配的是完整命令行,如果你在终端里敲的命令本身包含那个关键词,会把自己也杀掉。 比如pkill -f "serve.py 890"—— 执行它的这个 shell 命令行里就含这个串,会连自己一起 SIGTERM。 规避方法:用字符类,如pkill -f "serve[.]py 890"。
5. ss —— 看端口被谁占了
ss -ltnp # 列出所有监听的 TCP 端口
ss -ltnp | grep 8080 # 看 8080 被谁占着
输出里的 users:(("nginx",pid=1234,fd=6)) 就告诉你:nginx,PID 1234。
“端口被占用"是装软件最常见的报错,用这条命令一秒定位。
三、杀进程:三种信号,别只会 -9
kill PID # 默认发 SIGTERM(15),礼貌地请求退出
kill -15 PID # 同上
kill -9 PID # SIGKILL,强制杀死,不给机会
顺序很重要:
- 先
kill PID(SIGTERM)—— 程序能保存数据、正常退出 - 等几秒
- 还不死才
kill -9
⚠️
kill -9是最后手段。它不给程序任何清理机会——数据库可能因此损坏、正在写的文件可能变成半截。 新手最常见的错误是上来就-9。
| 信号 | 数字 | 行为 |
|---|---|---|
| SIGTERM | 15 | 请退出(可被程序忽略,方便清理) |
| SIGKILL | 9 | 立刻死(不可忽略,无法清理) |
| SIGHUP | 1 | 重读配置(很多服务用它热重载) |
| SIGINT | 2 | 中断(就是 Ctrl+C) |
四、服务:systemctl 是主角
现代 Linux(麒麟/UOS/Ubuntu/openEuler)都用 systemd 管服务。
五个最常用的
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
sudo systemctl reload nginx # 重载配置(不中断服务,优先用这个)
sudo systemctl status nginx # 看状态
status 的输出怎么看
systemctl status nginx
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; ...)
Active: active (running) since Tue 2026-10-20 12:00:00 CST; 2h ago
Main PID: 1234 (nginx)
三行关键:
| 行 | 看什么 |
|---|---|
Loaded | enabled / disabled → 是不是开机自启 |
Active | active (running) = 在跑;failed = 挂了;inactive = 停了 |
| 最后几行 | 最近的日志,挂了就看这里 |
开机自启
sudo systemctl enable nginx # 开机自启
sudo systemctl disable nginx # 取消开机自启
systemctl is-enabled nginx # 查当前状态
enable≠start。enable只是"下次开机时起来”,当前不会启动。 要让它"现在就跑,以后开机也跑":两条都要。sudo systemctl enable --now nginx # 一条命令搞定
列出所有服务
systemctl list-units --type=service --state=running # 正在跑的
systemctl list-units --type=service --state=failed # 挂掉的(排障必看)
systemctl list-unit-files --type=service | grep enabled # 开机自启的
五、为什么软件"点了没反应"
这是最典型的问题。按这个顺序查,一般三步内定位。
第 1 步:从终端启动它
别点图标,敲命令。
wechat
wps
dingtalk
报错会直接打在屏幕上——这就是最有价值的信息。
如果敲命令能起来,但点图标起不来 → 桌面快捷方式(.desktop 文件)配错了,见下一节。
第 2 步:如果是服务,看状态
systemctl status 服务名
journalctl -u 服务名 -n 50 --no-pager
failed 就看日志,90% 的答案在那儿。
第 3 步:看是不是端口被占
ss -ltnp | grep 端口号
被占了就换端口,或者先停掉占用的那个。
六、桌面图标点了没反应:.desktop 文件
Linux 的开始菜单项,本质是 ~/.local/share/applications/ 或 /usr/share/applications/ 下的 .desktop 文件。
ls /usr/share/applications/ | head
cat /usr/share/applications/某个软件.desktop
关键字段:
[Desktop Entry]
Type=Application
Name=微信
Exec=/opt/wechat/wechat %U ← 实际执行的命令
Icon=wechat
Terminal=false
Categories=Network;
常见问题:
| 现象 | 原因 | 修法 |
|---|---|---|
| 点了没反应 | Exec 路径错 / 文件没执行权限 | 改成正确路径;chmod +x |
| 图标是空白 | Icon 指的文件不存在 | 改成真实路径或系统图标名 |
| 菜单里根本没有 | 文件不在 applications 目录 | 复制过去 |
手动建一个(放在 ~/.local/share/applications/):
mkdir -p ~/.local/share/applications
nano ~/.local/share/applications/myapp.desktop
[Desktop Entry]
Type=Application
Name=我的工具
Exec=/home/你的用户名/tools/run.sh
Icon=utilities-terminal
Terminal=false
Categories=Utility;
chmod +x ~/.local/share/applications/myapp.desktop
七、动手:三个练习
练习 1:找到吃内存最多的三个进程
ps aux --sort=-%mem | head -4
head -4 是因为第一行是表头。
练习 2:启动一个后台进程,然后正确地停掉它
# 开一个会一直跑的命令
sleep 300 &
# 找到它
pgrep -a sleep
# 礼貌地停
kill 刚才的PID
练习 3:查一个服务的全部信息
systemctl status ssh # 或 sshd
systemctl is-enabled ssh # 是否开机自启
journalctl -u ssh -n 20 --no-pager
八、验证:你过关了吗
- 能用
ps aux | grep找到某个进程 - 能说出
kill和kill -9的区别,知道该先用哪个 - 会用
ss -ltnp查端口占用 - 会用
systemctl start/stop/restart/status - 知道
enable和start是两件事 - 能说出"点了没反应"该怎么查(终端启动 → 看报错)
九、不行怎么办
Q1:systemctl 报 Unit xxx.service not found
服务名不对。查准确名字:
systemctl list-unit-files | grep 关键词
注意很多服务名字和软件名不一样(比如 SSH 服务在 Debian 系叫 ssh,在 RPM 系叫 sshd)。
Q2:systemctl start 报 Failed to start: Access denied
需要 sudo。
Q3:服务一直 activating 或反复重启
journalctl -u 服务名 -n 100 --no-pager
看 Failed with result 那行,一般是配置错、端口占用、或者缺文件。
Q4:kill 了进程又自己起来了
说明有服务在守护它(systemd 会自动重启)。要停得停服务:
sudo systemctl stop 服务名
Q5:进程状态是 Z(僵尸)
僵尸进程已经死了,但父进程没回收它。一般无害,重启父进程或重启系统就清掉了。杀僵尸要杀它的父进程,杀它本身没用。
Q6:ss -ltnp 里看不到进程名,只有 -
权限不够。加 sudo:
sudo ss -ltnp
十、一句话总结
程序在硬盘上,进程在跑,服务是后台一直跑的进程。
查:
ps/top/ss。管:systemctl。杀:先kill,别急着-9。
← 上一篇 E1|文件权限 下一篇 → E3|日志分析:从一段报错定位问题