我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 的使用率。
应用程序在正常运行时运行良好,但作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位里做什么才能使服务启用此功能?
答案1
--user
联系该 UID 的每个用户的 systemd 实例,该实例仅在实际存在时启动登录会话针对该 UID。如果没有,您需要loginctl enable-linger <user>
让服务管理器始终为该用户运行。
Web 应用程序需要XDG_RUNTIME_DIR=
在其环境中具有正确的内容,以便能够找到总线套接字;它始终位于同一位置/run/user/<uid>
。(启用 linger 时,systemd 将创建该目录。)
您可能需要使用--service
而不是--scope
。后者由于缺乏“共同祖先”权限而无法在 cgroup 之间迁移您的进程,因此有必要让 systemd 本身启动该进程。
(在用户会话中,您自己的每个 UID user-1234.slice
cgroup 是您的交互式终端 cgroup 和新的 systemd 范围 cgroup 的共同祖先,但是当尝试从服务执行此操作时,唯一的共同祖先就是-.slice
您无权访问的祖先。)
配置 webapp .service 以便PAMName=
webapp 实际在登录会话中运行可以避免上述一些问题,但我也觉得它会导致新的问题,因此我不建议将其作为首选。