Skip to content
难度LEVEL★★★★
阅读READ约 3 分钟~3 min
更新UPDATED2026-09

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

easycode · Agent Skill

一个所有人都会撞上的谜题。你 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 协作写成——这本身就是这套书讲的工作方式。Written by Charles Tao with Claude — which is itself the working method this series teaches. · 许可License