在 systemd 服务中运行 systemd-run --user

在 systemd 服务中运行 systemd-run --user

我有一个处理用户输入的 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.slicecgroup 是您的交互式终端 cgroup 和新的 systemd 范围 cgroup 的共同祖先,但是当尝试从服务执行此操作时,唯一的共同祖先就是-.slice您无权访问的祖先。)


配置 webapp .service 以便PAMName=webapp 实际在登录会话中运行可以避免上述一些问题,但我也觉得它会导致新的问题,因此我不建议将其作为首选。

相关内容