Linux上のObsidian CLIをSSH経由でAIエージェントから使うとセグフォになる問題の解決策

突然 obsidian コマンドがセグフォするようになった

私はLinux(Ubuntu)上でObsidian VaultをAIエージェント(Claude Code)から操作するために、obsidian コマンドを日常的に使っています。obsidian filesobsidian tasksobsidian daily:append といったコマンドをスクリプトやAIエージェントから呼び出して、Vaultの管理を半自動化しています。

ある日、Claude Codeのセッション中に obsidian コマンドを呼んだところ、こんなエラーが返ってきました。

Segmentation fault (コアダンプ)
exit: 139

特に何かを変えたわけではないのに、突然動かなくなった。こういうときの原因調査は 変えたつもりはないが、実は変わっていたこと を探ると原因が見つけやすいと思っています。


原因:ElectronはGUIアプリであるがディスプレイが見つからない

調査してわかったことは、

-うまく動作していたときは、RDPでLinuxのデスクトップ環境にアクセスしていた - セグフォが発生するときは、SSH経由でアクセスしていた - Linux上での obsidian コマンドの実体が Electronベースのデスクトップアプリ

だということです。

$ file /opt/Obsidian/obsidian
ELF 64-bit LSB pie executable, x86-64 ... dynamically linked

ObsidianはElectronで作られたアプリケーションで、Linux上では起動時にX11またはWaylandのディスプレイサーバーへの接続を試みます。ところがSSH経由のターミナルのような ヘッドレス環境 では、$DISPLAY$WAYLAND_DISPLAY も設定されていません。

$ echo $DISPLAY

$ echo $WAYLAND_DISPLAY

ディスプレイが見つからないElectronは初期化に失敗し、セグフォルトという形でクラッシュします。

一方、RDP(リモートデスクトップ)経由で起動したターミナルでは正常に動作しました。RDPはグラフィカルセッションを提供するため、$DISPLAY が設定されているからです。

GUIアプリをCLIとして使う際は、ディスプレイの存在が前提になっている、というのが今回のポイントです。


解決策:Xvfbで仮想ディスプレイを用意する

Xvfb(X Virtual Framebuffer)とは、実際の画面がなくてもX11ディスプレイとして振る舞う仮想フレームバッファです。GUIアプリを「画面があると思い込ませて」ヘッドレスで動かすために使われます。

1. Xvfbのインストール

sudo apt install xvfb

2. 動作確認

xvfb-run -a obsidian version
# → 1.12.7 (installer 1.12.4)

xvfb-run -a は自動的に空きディスプレイ番号を選んで仮想ディスプレイを起動し、コマンド実行後に自動で終了してくれます。

3. ラッパースクリプトで透過化する

毎回 xvfb-run -a を手打ちするのは面倒なので、~/.local/bin/obsidian をラッパースクリプトに置き換えます。

# シンボリックリンクを削除してスクリプトに差し替え
rm ~/.local/bin/obsidian

cat > ~/.local/bin/obsidian << 'EOF'
#!/bin/bash
exec xvfb-run -a /opt/Obsidian/obsidian "$@"
EOF

chmod +x ~/.local/bin/obsidian

これで以降は普通に obsidian と呼ぶだけで、Xvfb経由で動くようになります。

$ obsidian files folder="0_Inbox" total
45

$ obsidian tasks all todo total
12

シンボリックリンクが壊れていた理由→ Flatpak版を利用していたときの名残り

今回のトラブルにはもう一つ伏線がありました。元々 ~/.local/bin/obsidian はFlatpak版Obsidianのバイナリへのシンボリックリンクでした。

~/.local/bin/obsidian → /var/lib/flatpak/exports/bin/md.obsidian.Obsidian

しかし、Flatpak版をアンインストールしてdeb版に乗り換えた際に、シンボリックリンクのリンク先が消えてしまいました。flatpak list が空になっていたことがその証拠です。

結果として: 1. ~/.local/bin/obsidian → 存在しないFlatpakバイナリ(壊れたリンク) 2. フォールバックで /usr/bin/obsidian → deb版のElectronアプリ → セグフォルト

という二重の問題が重なっていました。


まとめ

状況 動作
RDPターミナル ✅ 動作(ディスプレイあり)
SSH(修正前) ❌ セグフォルト
SSH(修正後) ✅ 動作(Xvfb経由)

Linux上でElectronアプリをヘッドレス環境からCLIとして使うには、Xvfbで仮想ディスプレイを提供するというのが今回の学びです。同じ問題はObsidianに限らず、Slack、VS Code、その他のElectronアプリをLinuxのCI/CDやスクリプトから呼ぶ場合にも発生しうるので、覚えておくと役に立ちます。なお、macOSやWindowsではディスプレイの扱いが異なるため、この問題はLinux特有の事象です。


参考資料