我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 使用率。
该应用程序在正常运行时运行良好,但是当作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位中做什么才能使该服务启用此功能?
我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 使用率。
该应用程序在正常运行时运行良好,但是当作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位中做什么才能使该服务启用此功能?
--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
您没有的的权限。)使用 a 配置 webapp .service
PAMName=
以便 webapp 实际上在登录会话中运行可以避免上述一些问题,但我也感觉它会导致新问题,所以我不建议将其作为第一个选项。