Masteries

技術的なことや仕事に関することを書いていきます.

VSCodeでCodespacesを動かしているとき、「code」コマンドが突然使えなくなった場合の対症療法

前回のブログにも書きましたが、最近はCodespacesをVSCodeで開いて開発をしています。

papix.hatenablog.com

想像していた以上に違和感なく使えていて、例えばVSCodeのターミナル(Codespaces上)でcode /path/to/file を実行すると、普通にCodespaces上にあるファイル/path/to/fileがそのままVSCodeで開けたりして、大変便利です。

…ただ、時折こういうエラーが出ることがありました:

Unable to connect to VS Code server: Error in request.
Error: connect ENOENT /tmp/vscode-ipc-XXXX.sock
    at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) {
  errno: -2,
  code: 'ENOENT',
  syscall: 'connect',
  address: '/tmp/vscode-ipc-XXXX.sock'
}

少なくともCodespacesのコンテナをrebuildすれば回復することを確認したのですが、たまに(週1くらい?)発生しており、都度rebuildするのは大変面倒でした。

あれこれ調べていた結果、$VSCODE_IPC_HOOK_CLI 環境変数で指定されたsockファイルが、/tmp にある vscode-ipc- がprefixなsockファイルのうち最新のものより古い場合、前述のエラーが発生している… ということに気づきました(いつもはCodespaces上でtmux+zshの環境を構築して使っていて、問題が発生したときにたまたまbashで実行してみたら前述のエラーが発生せず、違いを調べていたときに、$VSCODE_IPC_HOOK_CLIが異なることに気づきました)。

ひとまず対症療法として、以下のコマンドで/tmp以下にある最新のvscode-ipc-がprefixなsockファイルを引いてきて、それを$VSCODE_IPC_HOOK_CLIに設定することで問題を解決することができました。

export VSCODE_IPC_HOOK_CLI="/tmp/$(ls /tmp -t | grep 'vscode-ipc' | head -n 1)"

おそらく、$VSCODE_IPC_HOOK_CLIを更新するような仕組みがあるはずなのですが、自分があれこれCodespacesをいじくりまわした結果、うまく動いていないのかもしれません。そのあたりの調査は時間があったときに委ねようと思います…。取り急ぎ、対症療法だけ忘備録がてら書き残しておきます。