오늘 나는 Arch Linux를 실행하는 내 컴퓨터가 존재하지 않는다는 ssh
사실에 놀랐습니다 ./run/user/$(id -u)
이것XDG 기본 디렉토리 사양설명하다:
$XDG_RUNTIME_DIR
사용자별 필수적이지 않은 런타임 파일과 기타 파일 개체(예: 소켓, 명명된 파이프...)를 저장해야 하는 기본 디렉터리를 기준으로 정의합니다. 디렉토리는 사용자가 소유해야 하며 해당 디렉토리에 대한 읽기 및 쓰기 액세스 권한을 가진 유일한 사람이어야 합니다. Unix 액세스 모드는 이어야 합니다0700
.디렉토리의 라이프사이클은 로그인한 사용자에게 바인딩되어야 합니다. 사용자가 처음 로그인할 때 디렉터리를 생성해야 하며, 사용자가 완전히 로그아웃하면 디렉터리를 삭제해야 합니다. 사용자가 여러 번 로그인하는 경우 동일한 디렉터리를 가리켜야 하며 해당 디렉터리는 첫 번째 로그인부터 마지막 로그아웃까지 시스템에 남아 있어야 하며 이 기간 동안 삭제할 수 없습니다. 디렉터리의 파일은 재부팅이나 전체 로그아웃/로그인 주기 후에 유지될 수 없습니다.
systemd
상자 에서 /run/user/$(id -u)
선호하는 위치 는 무엇입니까 $XDG_RUNTIME_DIR
(생성해야 하는 경우에도?)
그렇지 않은 경우 이를 만드는 가장 좋은 방법은 무엇입니까 $XDG_RUNTIME_DIR
?
"완전히" 로그아웃할 때만 디렉토리가 삭제되도록 하려면 어떻게 해야 합니까?
("완료"는 로그인 쉘에 의해 생성된 모든 프로세스가 종료되었음을 의미합니까? 확인하는 방법은 무엇입니까?)
답변1
디렉토리, 서비스 및 환경 변수는 시스템별 플러그형 인증 모듈 및 서비스에 의해 관리됩니다. 첫 번째 로그인 시 디렉터리를 생성하고 여기에 마운트된 파일 시스템을 생성한 다음 마지막 로그아웃 시 서비스를 시작하고 서비스를 중지하고 파일 시스템을 마운트 해제하고 디렉터리를 삭제합니다. 이 동작은 계정에 systemd 옵션이 설정되면 변경됩니다./run/user/N
user@N
XDG_RUNTIME_DIR
logind
linger
다른 시스템은 다르게 작동합니다.
추가 읽기
- Lennart Petlinget al. (2017).
pam_systemd
.시스템 매뉴얼 페이지. freedesktop.org. - sudo -i가 대상 사용자에 대해 XDG_RUNTIME_DIR을 설정하지 않는 이유는 무엇입니까?
- 조나단 데보인 폴라드(2018). "사용자별 시스템 서비스". 스낵 가이드. 소프트웨어.
- https://unix.stackexchange.com/a/386658/5132
- https://unix.stackexchange.com/a/434647/5132
- https://unix.stackexchange.com/a/423648/5132
답변2
$XDG_RUNTIME_DIR
로그인 시 설정/생성
$XDG_RUNTIME_DIR
설정된 경우 기존 항목이 사용됩니다.systemd
그렇지 않으면 s가 있으면 사용하세요./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