Skip to content

第 3 章 让程序永远醒着:进程、后台服务、开机自启

一个所有人都会撞上的谜题:你 SSH 上去,手动跑 python3 read_card.py,程序欢快地转起来;你断开 SSH——它死了。为什么?因为你手动启动的程序是你这次会话的孩子,会话结束,孩子被一并收走。而我们要的,是第一册第 5 章承诺过的那种"永远醒着"。

先补一个正名:进程(Process)——正在运行中的程序。程序是躺在磁盘上的文件,进程是它活过来的样子,每个进程有个编号(PID)。top 里滚动的那一列就是它们;kill PID 是客气地请某个进程退出(kill -9 是强制驱逐,最后手段)。

让程序脱离你的会话、永远活着,正规军方案叫 systemd——Linux 自带的"服务管家"。思路是登记制:写一张登记表(叫 unit 文件),告诉管家这个程序是谁、怎么启动、死了要不要扶、开机要不要自动跑。一张最小的登记表长这样:

ini
[Unit]
Description=ForgeCard reader

[Service]
ExecStart=/usr/bin/python3 /home/pi/forgecard/read_card.py
Restart=always

[Install]
WantedBy=multi-user.target

逐行读:它叫什么;用哪条命令启动;Restart=always——死了自动扶起来;最后一行大意是"正常开机流程里带上它"。登记之后,指挥管家只需四个命令:systemctl start/stop/restart/status 名字(起、停、重启、看状态),外加 systemctl enable 名字(开机自启)。还有一条马上就离不开的:journalctl -u 名字 -f——看这个服务的日志,-f 是第二册学过的"追着看"。

这里有一条值得单独说破的哲学:Restart=always 承认了一个真相——程序会崩。与其追求写出永不崩溃的程序(没人做得到,AI 也不行),不如让管家把"崩了就扶起来"变成系统的本能。这和我们整套书的心法一脉相承:不指望不犯错,指望错误发生时有人接住。

合龙时刻:ForgeCard 的树莓派一通电就自动开始读卡,等的就是这套机制(或它的同类)。你们早就在享受"服务管家"的照顾,今天终于知道了它的名字。顺带认个脸:Node 世界常见一个叫 pm2 的工具,同样的思路、另一位管家,见到不慌。

出事时想起我

"SSH 一断程序就死"——没登记给管家,还在裸跑;"重启服务器后服务没起来"——登记了但没 enable;"服务显示在跑却不干活"——systemctl status 看状态,journalctl -u 读日记,答案几乎总在里面。

关键领悟

"永远醒着"从来不是程序自己的本事,是管家的本事。把程序登记给 systemd,活着就成了系统的责任,而不是你的运气。

试一试(安全档:只读,树莓派上做)

systemctl status 加服务名,看看读卡服务的登记信息和当前状态;再 journalctl -u 服务名 -n 20 读它最近二十行日记。想练手写登记表的话,让 AI 陪你在树莓派上给一个无害的小脚本(比如每分钟写一行时间戳)注册成服务,走完 start、status、enable、重启验证的全流程。

由 Charles Tao 与 Claude 协作写成——这本身就是这套书讲的工作方式。 · 许可