今日、私は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