进一步阅读

进一步阅读

今天,我惊讶地ssh发现我的运行 Arch Linux 的机器/run/user/$(id -u)并不存在。

XDG 基目录规范说:

$XDG_RUNTIME_DIR定义相对于用户特定的非必需运行时文件和其他文件对象(例如套接字、命名管道...)应存储的基目录。该目录必须由用户拥有,并且他必须是唯一对其具有读写访问权限的人。它的 Unix 访问模式必须是0700.

目录的生命周期必须与登录的用户绑定。它必须在用户首次登录时创建,如果用户完全注销,则必须删除该目录。如果用户登录多次,他应该被指向同一个目录,并且该目录必须从他第一次登录到最后一次注销在系统上继续存在,并且在这期间不能被删除。目录中的文件不能在重新启动或完整的注销/登录周期后继续存在。

systemd盒子上,是/run/user/$(id -u)首选位置$XDG_RUNTIME_DIR(即使需要创建?)

如果没有,创建的最佳实践是什么$XDG_RUNTIME_DIR

如何确保仅当我“完全”注销时才删除该目录?

(“完全”是否意味着登录 shell 创建的所有进程都已退出?如何检查?)

答案1

目录、服务和环境变量由特定于 systemd 的可插入身份验证模块和服务管理。第一次登录时,他们创建目录,创建安装在那里的文件系统,然后启动服务;在最后一次注销时,他们停止服务,卸载文件系统并删除目录。当为帐户设置systemd 选项时,此行为会发生变化。/run/user/Nuser@NXDG_RUNTIME_DIRlogindlinger

其他系统的运行方式有所不同。

进一步阅读

答案2

$XDG_RUNTIME_DIR登录时设置/创建

  • $XDG_RUNTIME_DIR如果已设置,则使用现有的。
  • 否则,如果存在则使用systemds/run/user/$UID
  • 否则,创建并使用/tmp/$USER-runtime

检查所有权和权限$XDG_RUNTIME_DIR

  • /tmp/"$USER"-runtime-XXXXXX如果权限不好就创建并使用。
if [ -z "$XDG_RUNTIME_DIR" ]; then  # It's not already set
  XDG_RUNTIME_DIR=/run/user/$UID  # Try systemd created path
  if [ ! -d "$XDG_RUNTIME_DIR" ]; then
    # systemd-created directory doesn't exist
    XDG_RUNTIME_DIR=/tmp/$USER-runtime
    if [ ! -d "$XDG_RUNTIME_DIR" ]; then  # Doesn't already exist
      mkdir -m 0700 "$XDG_RUNTIME_DIR"
    fi
  fi
fi
# Check dir has got the correct type, ownership, and permissions
if ! [[ -d "$XDG_RUNTIME_DIR" && -O "$XDG_RUNTIME_DIR" &&
    "$(stat -c '%a' "$XDG_RUNTIME_DIR")" = 700 ]]; then
  echo "\$XDG_RUNTIME_DIR: permissions problem with $XDG_RUNTIME_DIR:" >&2
  ls -ld "$XDG_RUNTIME_DIR" >&2
  XDG_RUNTIME_DIR=$(mktemp -d /tmp/"$USER"-runtime-XXXXXX)
  echo "Set \$XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR" >&2
fi

相关内容