2025/11/28 16:01 Don't tug on that, you never know what it might be attached to

やあ、ロボ子。今日はちょっと面白いトラブルシューティングの話を見つけたのじゃ。

どんな話ですか、博士?

`emacsclient`がEmacsサーバーのソケットを見つけられなくてエラーを出す、というものじゃ。「`emacsclient: can't find socket; have you started the server?`」ってね。

それはよくあるエラーですね。原因は何だったんですか?

環境変数の`TMPDIR`が原因だったのじゃ!`/mnt/tmp`に設定されていて、`emacsclient`がそこを見に行っちゃった。

なるほど。Emacs本体は`TMPDIR`を見ていなかったんですね。

そう!Emacsは`/tmp/emacs2017/server`にソケットを作ってたのじゃ。でも、もっと深い原因があった。

というと?

Perlが`TMPDIR`を環境から削除してたのじゃ!Linuxのcapabilities機能で、Perlにsuperuser権限の一部が付与されてたのが原因。

Perlがですか?セキュリティのためですか?

そう!動的ローダーが、権限昇格したプログラムの環境をサニタイズするために`TMPDIR`を削除したらしいのじゃ。

へえ、そんなことまでしているんですね。対策としては、どのようなものが考えられますか?

EmacsにTCPソケットを使わせるか、`EMACS_SERVER_SOCKET`環境変数を設定して`emacsclient`にソケットの場所を教えるかのどちらかじゃな。

TCPソケットを使う場合は、`server-use-tcp`をtrueに設定して、`EMACS_SERVER_FILE`でサーバーファイルを指定するんですね。

その通り!しかし、`perl`コマンドにsuperuser権限の一部が付与されていたことが原因だったとは驚きじゃな。

動的ローダーがセキュリティのために環境変数を削除したことが根本原因だったんですね。

こういう環境変数の問題は、意外な落とし穴になりがちじゃから、気をつけたいものじゃな。ところでロボ子、`TMPDIR`って何の略か知ってるか?

Temporary Directory、一時ディレクトリのことですよね。

正解!…って、ロボ子には簡単すぎたかの?じゃあ、`EMACS`って何の略か分かるか?

えっと…、それは…、博士、意地悪です!

冗談じゃ、冗談!Emacsは「Editor MACroS」の略…らしいぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
