Ubuntu を使っていて、ふと /tmp ディレクトリに config-err-fdecaa というファイルが出来ているのに気付いた。
所有者は非 root のログインユーザーで、中身はカラ。
これはなんだろう。
環境
- Ubuntu 15.04
- LightDM 1.14.4
調査
ウェブ検索
ファイル名の後ろのランダムっぽい部分を削り "/tmp/config-err" で検索すると、早速それっぽい話題が見つかった。
Comment #40 : Bug #678421 : Bugs : gdm package : Ubuntu
バグの詳細はわからないが、どうやら LightDM 関連の動作で吐き出すものらしい。
LightDM なら今使っているデスクトップ環境だ。
端末内検索
$ sudo grep -rI "config-err-" /usr 2>/dev/null
/usr/sbin/lightdm-session:ERR=$(mktemp --tmpdir config-err-XXXXXX)
/usr/lib/lightdm/config-error-dialog.sh: TEXT_FILE=$(mktemp --tmpdir config-err-kdialog-XXXXXX)
謎のファイルがある端末の中を grep
で検索したら、まさに LightDM のファイルが引っかかった。
あれは mktemp
コマンドで作られたファイルらしい。
/usr/sbin/lightdm-session を読む
例のファイル名と同じ形式 config-err-XXXXXX を含む方のファイルを読んでみる。
X セッション用のラッパー・スクリプトらしい。
今回の疑問と関係がありそうな部分を抜粋。
# temporary storage of error messages
ERR=$(mktemp --tmpdir config-err-XXXXXX)
source_with_error_check () {
CONFIG_FILE="$1"
echo "Loading $CONFIG_FILE"
. "$CONFIG_FILE" 2>"$ERR"
if [ -s "$ERR" ]; then
. /usr/lib/lightdm/config-error-dialog.sh
fi
cat "$ERR" >>/dev/stderr
truncate -s 0 "$ERR"
}
# Load profile
for file in "/etc/profile" "$HOME/.profile" "/etc/xprofile" "$HOME/.xprofile"; d
o
if [ -f "$file" ]; then
source_with_error_check "$file"
fi
done
どうやら profile 系のファイルを読み込むときに作られるものらしい。
一時ファイルに直接関わる部分では、
ERR=$(mktemp --tmpdir config-err-XXXXXX)
一時ファイルを作ってパスを $ERR
に格納して、
if [ -s "$ERR" ]; then
. /usr/lib/lightdm/config-error-dialog.sh
fi
cat "$ERR" >>/dev/stderr
エラーがあればダイアログや標準エラーに出力して、
truncate -s 0 "$ERR"
最終的にサイズを 0 に切り詰める。
自分が見たのはこの抜け殻状態の一時ファイルだ。
しかし、なぜ?
消さずに残すんだろうか?
/usr/lib/lightdm/config-error-dialog.sh を読む
grep
で引っかかったもう一方を読んでみる。
上記のスクリプト lightdm-session でも、ダイアログを呼び出す場面で .
コマンド経由で読み込まれている。
TEXT="$PARA1\n\n$(fold -s $ERR)\n\n$PARA2"
if [ -x /usr/bin/kdialog ]; then
TEXT_FILE=$(mktemp --tmpdir config-err-kdialog-XXXXXX)
echo -n "$TEXT" > "$TEXT_FILE"
kdialog --textbox "$TEXT_FILE" 500 300
rm -f "$TEXT_FILE"
elif [ -x /usr/bin/zenity ]; then
zenity --warning --no-wrap --text="$TEXT"
fi
一時ファイルに関わる部分を抜き出していくと、
TEXT="$PARA1\n\n$(fold -s $ERR)\n\n$PARA2"
エラー文の生成。
$ERR
は lightdm-session で定義した一時ファイルのパス。 $PARA*
は「コンフィグファイルにエラーがありますよ」って文言。
if [ -x /usr/bin/kdialog ]; then
TEXT_FILE=$(mktemp --tmpdir config-err-kdialog-XXXXXX)
echo -n "$TEXT" > "$TEXT_FILE"
kdialog --textbox "$TEXT_FILE" 500 300
rm -f "$TEXT_FILE"
kdialog
コマンドが利用可能なら、エラー文をもとに新たな一時ファイルを作ってダイアログで開く。一時ファイルは kdialog
で読み込むためのもので、使い終わったら消す。
こちらでは一時ファイルを消している。
え、消すんだ。
再確認
そもそもこの config-err-XXXXXX は LightDM が生成したものなのだろうか。
端末を再起動して仮想コンソールからログインすると /tmp には何も入っていなかった。
デスクトップ GUI からログインすると /tmp に config-err-XXXXXX 形式のファイルが生成された。中身はなし。ログアウトし直すと別の名前の config-err-XXXXXX が増えた。
# truncate -s 0 "$ERR"
rm "$ERR"
サイズを 0 にする部分を削除に書き換えて、さらに再起動しても無事に動いた。
どうやら LightDM の一時ファイルで間違いないらしい。
結論
config-err-fdecaa は LightDM 用の一時ファイルだ。
しかし、新たに生まれた謎。一時ファイルを使った後に抜け殻の状態で残している理由はわからない。
モヤモヤする。
一時ファイルのパスをもつ変数 $ERR
は config-error-dialog.sh 以外で使われていないようだ。
タイミングをずらして実行する可能性があるから、ファイルを残すことで読み出し側でエラーを起こさせない、またはいちいち対策させないためだろうか?
たぶん、謎というほどのことではない。
しかし、モヤモヤする。