在旧应用程序上执行 systemctl-status 时,我们现在看到此错误/警告:
"systemd[1]: Refusing to accept PID outside of service control group, acquired through unsafe symlink chain"
我尝试删除链中的符号链接,但却得到了以下结果:
"New main PID xxxxx does not belong to service, and PID file is not owned by root. Refusing."
当尝试检查 pid 文件时,它甚至还没有被创建。
尽管出现这些错误/警告,但应用程序似乎仍在运行...所以我不确定这个错误是什么时候开始出现的,但我怀疑它是在过去几年中 RHEL OS 升级后开始的。
一些初步的谷歌搜索并没有发现太多有用的信息......
在哪里可以找到这些消息的解释?
什么才是“不安全”?
那该怎么办呢?
答案1
该消息听起来就像您正在使用一个过时的 PID 文件,该文件未被您的守护进程更新,并且仍然包含多次重启之前的 PID。
当尝试检查 pid 文件时,它甚至还没有被创建。
systemd永远不会创造PID 文件,它仅读它们。如果你决定需要 PID 文件,那么守护进程的工作就是在其中写入自己的 PID。
如果您的守护进程不写入 PID 文件,则PIDFile=
根本不要使用该选项。(如果有,请将选项更改为直接指向 PID 文件,而不是通过多个符号链接。)
什么才是“不安全”?
“不安全的符号链接链”意味着存在一个非 root 拥有的符号链接,该符号链接指向 root 拥有的文件 - 这被认为是不安全的,因为存在非 root 用户可能导致 systemd 读取意外文件的风险(例如,如果 /tmp/something.pid 符号链接到 /etc/shadow,它可能会通过“解析错误”消息泄露目标文件的内容)。使用namei -l <path>
查看此信息。
“服务 cgroup 之外”是不安全的,因为如果允许服务 1 将属于服务 2 的进程声明为其主 PID,则很容易欺骗 systemd 和/或系统管理员终止其他服务。
Systemd 服务跟踪与内核 cgroup 紧密相关。接受 cgroup 之外的 PID 作为主进程是不必要的,因为这会导致令人困惑的情况:服务正在运行但其 cgroup 为空,或者两个服务共享同一个主 PID。