systemd 服务因 /tmp 目录消失而启动失败:一次证书工具的修复记录

问题背景 某台 Linux 服务器上运行着一个内部证书申请工具。该工具通过 Web 页面发起 ACME 证书申请,并使用 DNS TXT 记录完成域名验证。 应用采用 Python 编写,通过 Gunicorn 运行,仅监听本机回环地址,再由 Web 服务器进行反向代理。 其目录结构大致如下: 临时目录中可能出现: 证书签发完成后,还可能短暂保存: 这些文件包含证书和私钥,因此不适合长期保存在服务器上。证书下载完成后,应尽快清除服务器副本。 故障现象 服务器重启后,证书工具无法启动。查看 systemd 状态时发现服务不断退出并自动重启: 由于服务配置了自动重启,短时间内重复失败,最终形成了持续的重启循环,累计重启次数达到数万次。 需要注意的是,此时 Gunicorn 和 Python 应用实际上还没有开始执行。 故障发生在 systemd 为服务建立挂载命名空间的阶段。 根本原因 服务的 unit 文件中包含类似配置: 这项配置用于限制服务可写入的位置,是一种合理的 systemd 安全加固措施。 问题在于: 在服务启动前必须已经存在。 /tmp 本身是临时文件系统。系统重启后,其中的自定义目录可能被正常清除。当 systemd 尝试根据 ReadWritePaths= 建立服务的挂载命名空间时,发现目录不存在,于是直接返回: …