适用: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,强制杀死,不给机会

顺序很重要:

  1. 先 kill PID(SIGTERM)—— 程序能保存数据、正常退出
  2. 等几秒
  3. 还不死才 kill -9

⚠️ kill -9 是最后手段。它不给程序任何清理机会——数据库可能因此损坏、正在写的文件可能变成半截。 新手最常见的错误是上来就 -9。

信号数字行为
SIGTERM15请退出(可被程序忽略,方便清理)
SIGKILL9立刻死(不可忽略,无法清理)
SIGHUP1重读配置(很多服务用它热重载)
SIGINT2中断(就是 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)

三行关键:

行看什么
Loadedenabled / disabled → 是不是开机自启
Activeactive (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|日志分析:从一段报错定位问题