先看现象。CentOS 7 上把 /usr/lib/systemd/system/app.service 里的 User 改成 app,daemon-reload 加 restart 之后 ps 里还是 root,systemctl cat 一打出来,User 出现了两次,中间试过重装服务包也没用。

把日志和配置对完,能解释这个现象的基本就这几处。/etc/systemd/system/app.service.d/ 里的 drop-in 也写了 User=root,它的优先级高于主文件。也可能是改的是 /usr/lib 下由 rpm 管理的文件,下次升级会被覆盖回去。

另外,只改了文件没 daemon-reload,systemd 内存里还是旧 unit。

动手时先看合并后的最终内容

systemctl cat app

接着找出所有覆盖来源

ls /etc/systemd/system/app.service.d/ && grep -rn 'User=' /etc/systemd/system/

再往下用官方位置写覆盖

systemctl edit app 里写 [Service]  User=app

剩下的就是重载并验证进程属主

systemctl daemon-reload && systemctl restart app && ps -o user,cmd -C app

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

怎么算真的好了,看的是同一批现象。systemctl show app -p User 返回 app,ps 里进程属主是 app,日志中不再出现 Permission denied。

提醒一点。同一个键写两次是排查 systemd 问题的第一嫌疑,systemctl cat 比看源文件可靠;改动一律放 /etc 下,别碰 /usr/lib。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189