人人都能学编程
English 开始学习
核心 · Linux第 5 课 / 共 6 课免费阅读

进程与服务 · 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
逐步执行
  1. L1web 的 PID 是 1201。
  2. L2Active: active (running),开机自启。

修好一个失败的服务

在互动课里运行

数据库失败了。日志说明了原因:缺一个配置文件。把它建出来,再启动服务。

systemctl status db
journalctl -u db
sudo touch /etc/db.conf
sudo systemctl start db
systemctl status db
逐步执行
  1. L1Active: failed。
  2. L2日志点出了缺少的文件。db: config file /etc/db.conf not found
  3. L3/etc 属于 root,在那里建文件要 sudo。
  4. L5Active: active (running)。

常见错误

不看日志就重启

如果原因还在,服务还会再失败,白白浪费时间。先读 journalctl -u。

start 不等于 enable

start 是现在启动;enable 是重启后自动启动。服务器半夜重启后,没 enable 的服务就不会回来。

小测验

1. `sudo systemctl start db` 报错「Job for db.service failed」。下一步做什么?

  1. A再跑一次同样的 start
  2. B读 `journalctl -u db`
  3. Cchmod 777 /etc
查看答案

答案:B

日志会说明失败原因。重复命令或去掉保护都解决不了根本问题。

2. 这段代码会输出什么?

sudo systemctl stop web
systemctl status web
  1. A
    ● web.service - Shop web server
         Loaded: loaded (/etc/systemd/system/web.service; enabled)
         Active: inactive (dead)
      Started Shop web server.
      Stopped Shop web server.
  2. B
    ● web.service - Shop web server
         Loaded: loaded (/etc/systemd/system/web.service; disabled)
         Active: inactive (dead)
      Started Shop web server.
      Stopped Shop web server.
  3. C
    ● web.service - Shop web server
         Loaded: loaded (/etc/systemd/system/web.service; enabled)
         Active: active (running)
      Started Shop web server.
      Stopped Shop web server.
查看答案

答案:A

stop 让它现在停下,但它仍然是 enabled,重启机器后还会再启动。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出停掉一个进程

    执行完这些命令后,哪一项是对的?

  2. 改需求让数据库恢复

    这些命令想启动 db,但是失败了。修好它们,让数据库运行起来,并且重启后会自动启动。

  3. 从零写安全地重启

    重启 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.