进程与服务 · Linux 与命令行
怎么看正在运行什么,又怎么重启坏掉的服务?
课程目录为什么需要它
「网站挂了」通常意味着某个程序停了。服务器上长期运行的程序叫服务,由 systemd 管理。会查看服务状态、读懂它为什么失败、修好再启动,这是值班的核心本领。
直觉理解
每个正在运行的程序都是一个进程,有一个编号,叫 PID。ps 列出它们;kill PID 让某个进程停下。
服务是 systemd 照看的进程:
systemctl status web:在不在跑,最近几行日志sudo systemctl start|stop|restart web:改变它的状态(要 sudo)sudo systemctl enable web:重启机器后自动启动journalctl -u web:这个服务的完整日志
套路永远一样:看状态 → 读日志 → 修 → 启动 → 再看状态。
定义
进程与 PID
A running program and its process id. The same program started twice is two processes with two PIDs.正在运行的程序和它的进程编号。同一个程序启动两次,就是两个进程、两个 PID。
服务(systemd 单元)
A program systemd starts, restarts when it crashes, and can start at boot. Its state is active, inactive or failed.由 systemd 启动、崩溃时重启、可以开机自启的程序。状态是 active(运行中)、inactive(未运行)或 failed(失败)。
示例
查看一个正常的服务
在互动课里运行网页服务器在运行:ps 能看到它的进程,status 显示 active。
ps
systemctl status web逐步执行
- L1web 的 PID 是 1201。
- L2Active: active (running),开机自启。
修好一个失败的服务
在互动课里运行数据库失败了。日志说明了原因:缺一个配置文件。把它建出来,再启动服务。
systemctl status db
journalctl -u db
sudo touch /etc/db.conf
sudo systemctl start db
systemctl status db逐步执行
- L1Active: failed。
- L2日志点出了缺少的文件。
db: config file /etc/db.conf not found - L3/etc 属于 root,在那里建文件要 sudo。
- L5Active: active (running)。
常见错误
不看日志就重启
如果原因还在,服务还会再失败,白白浪费时间。先读 journalctl -u。
start 不等于 enable
start 是现在启动;enable 是重启后自动启动。服务器半夜重启后,没 enable 的服务就不会回来。
小测验
1. `sudo systemctl start db` 报错「Job for db.service failed」。下一步做什么?
查看答案
答案:B
日志会说明失败原因。重复命令或去掉保护都解决不了根本问题。
2. 这段代码会输出什么?
sudo systemctl stop web
systemctl status web查看答案
答案:A
stop 让它现在停下,但它仍然是 enabled,重启机器后还会再启动。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出停掉一个进程
执行完这些命令后,哪一项是对的?
- 改需求让数据库恢复
这些命令想启动
db,但是失败了。修好它们,让数据库运行起来,并且重启后会自动启动。 - 从零写安全地重启
重启
web服务,然后显示它的状态,确认成功了。只在需要的地方用 sudo。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Process | 进程 | A running program, identified by its PID. |
| Service | 服务 | A long-running program managed by systemd. |
| On call | 值班 | Being the person who responds when production breaks. |