コンテンツへスキップ
ガイド

Failed to start Chrome CDP on port 18800

LinuxでsnapのChromiumがOpenClawのブラウザ制御を壊す理由

7分で読めます

エージェントにページを開くよう頼むと、ツール呼び出しから返ってくるのは「Failed to start Chrome CDP on port 18800 for profile openclaw」というJSONの1行だけです。このメッセージには、どの部分が失敗したのかが何も書かれておらず、ヘッドレスのLinuxマシンではブラウザが画面に現れることもありません。よくある原因はOpenClawではなく、aptがインストールしたブラウザです。

4つのエラー文字列、4つの異なる原因

  • 「Failed to start Chrome CDP on port 18800 for profile openclaw」は、管理対象プロファイルがデバッグ用ポートで起動できていないことを示します。Ubuntuでよくある理由は、マシン上のChromiumが本物のブラウザバイナリではなく、snapのラッパーであることです。
  • 「The profile appears to be in use by another Chromium process」は、管理対象プロファイルのディレクトリに古いSingletonロックファイルが残っていることを示します。ロックが現在のホスト上の終了済みプロセスを指している場合、OpenClawはそのロックを削除して1回だけ再試行します。ただし、別のホスト名を指すロックは、プロファイルがもう使われていないことをあなたが確認するまで保持されます。マシン名を変更した後も同様です。
  • 「Missing X server or $DISPLAY」は、デスクトップセッションのないホストで、画面に表示されるブラウザが明示的に要求されたことを意味します。ローカルの管理対象プロファイルは、LinuxでDISPLAYとWAYLAND_DISPLAYの両方が未設定の場合、すでにヘッドレスへフォールバックします。つまりこのエラーが出るのは、何かが画面表示ありのブラウザを強制しているということです。OPENCLAW_BROWSER_HEADLESS=0、falseに設定されたbrowser.headless、または個別のプロファイルに設定された同じキーのいずれかです。
  • 「Port N is in use for profile NAME but not by openclaw」というエラーは、ループバックの外部CDPサービスがすでに設定されているのに、attachOnlyがまだfalseのままのときに表示されます。修正方法は、OpenClawに独自のブラウザを起動させるのをやめることで、これが後述するattach-onlyの方法です。
snapのAppArmorによる閉じ込めは、OpenClawがブラウザプロセスを起動し監視する方法に干渉します。

apt install chromiumが根本原因である理由

Ubuntuをはじめ、ほとんどのLinuxディストリビューションでは、apt install chromiumを実行してもブラウザは手に入りません。このパッケージはchromium-browserに解決され、aptはchromiumの代わりにchromium-browserを選択したという注記を表示し、ディスクに置かれるのはsnapのラッパーです。これが問題になるのは、OpenClawがローカルでブラウザを起動するとき、Chrome、Brave、Edge、Chromium、Chrome Canaryの順で最初に見つかったものを使うからです。Linuxでの検索パスは/usr/bin、/snap/bin、/opt/google、/opt/brave.com、/usr/lib/chromium、/usr/lib/chromium-browserで、さらにPLAYWRIGHT_BROWSERS_PATHまたは~/.cache/ms-playwright配下にあるPlaywright管理のChromiumも対象になります。snapがChromium系の唯一のバイナリである新しいサーバーでは、検出がそれを見つけ、管理対象の起動はすべてそこで失敗します。どんなフラグの組み合わせでもこれは直らないため、ドキュメントの答えは別の設定ではなく別のバイナリなのです。

問題を解決する3つの方法

  • 推奨される修正は、本物のGoogle Chromeをインストールすることです。dl.google.comからgoogle-chrome-stable_current_amd64.debを取得してdpkg -iでインストールし、依存関係のエラーが出たらsudo apt --fix-broken install -yを実行します。その後、~/.openclaw/openclaw.jsonでbrowser.executablePathを/usr/bin/google-chrome-stableに設定し、enabled、headless、noSandboxをすべてtrueにします。
  • snapのChromiumを残す必要がある場合は、attach-onlyモードを使います。browser.attachOnlyをtrueに設定してOpenClawが何も起動しないようにし、chromium-browser --headless --no-sandbox --disable-gpu --remote-debugging-port=18800 --user-data-dir=$HOME/.openclaw/browser/openclaw/user-data about:blankでブラウザを自分で起動します。
  • systemdのユーザーサービスを使えば、この手動で起動したブラウザをシェルの終了後も動かし続けられます。同じフラグで/snap/bin/chromiumを実行し、Restart=on-failureとRestartSec=5を加えたユニットを~/.config/systemd/user/openclaw-browser.serviceに置き、systemctl --user enable --now openclaw-browser.serviceで有効化すれば、OpenClawが要求する前にCDPポートが待ち受け状態になります。

設定項目は6つで、デフォルト値はサーバーではなくノートPCに合わせたものです。browser.enabledはブラウザ制御を有効にする設定で、すでにtrueになっています。browser.executablePathはChromiumベースのバイナリ(Chrome、Brave、Edge、Chromium)へのパスで、省略すると自動検出され、OSのデフォルトブラウザがChromiumベースであればそれが優先されます。browser.headlessはGUIなしで実行する設定でデフォルトはfalseのため、サーバーでは明示的に設定する必要があります。プロセス単位の上書きとしてOPENCLAW_BROWSER_HEADLESSも使えます(デフォルトでは未設定)。browser.noSandboxは一部のLinux環境で必要な--no-sandboxフラグを追加し(デフォルトはfalse)、browser.attachOnlyはOpenClawによるブラウザの起動を完全に止めます(デフォルトはfalse)。attach-onlyは、Raspberry Pi、古いVPSホスト、低速なストレージでもドキュメントが示す解決策です。こうした環境では、ChromeがCDPのHTTPエンドポイントを公開するまでに、管理対象ブラウザの期限を超える時間がかかるためです。LinuxでのOpenClawガイドではLinuxへのインストール全般を解説しており、VPSでのOpenClawガイドは誰も前に座っていないサーバーのためのチェックリストです。

CDPの起動失敗か、ナビゲーションのブロックか

ブラウザを設定したら、ほかを調べる前にまず動作を確認します。これらのチェックの宛先は、起動時に使われるChromeのCDPポートではなく、OpenClawのブラウザ制御サービスです。そのポートはgateway.portから導かれ、デフォルトは18791(gatewayのポートに2を足した値)なので、Gatewayを別のポートに移した場合は合わせて調整してください。curlでルートパスを要求するとrunning、pid、chosenBrowserが返ります。次に/startへPOSTし、続いて/tabsをGETします。そのうえで、2種類の失敗を切り分ける段階的なチェックを実行します。openclaw browser --browser-profile openclaw start、次にtabs、次にopen https://example.comです。startがnot reachable after startで失敗する場合、コントロールプレーンが正常ではなく、追うべきはCDPの準備状況です。startが成功してtabsが失敗する場合も、それはまだ到達性の問題であり、ページの問題ではありません。startとtabsが両方成功し、openまたはnavigateだけが失敗する場合、ブラウザは正常で、問題はナビゲーションポリシーかページそのものにあります。これは別のコードパスです。browser.ssrfPolicyを一度も書いていなくても、ブラウザ設定のデフォルトはフェイルクローズのSSRFポリシーオブジェクトであり、startやtabsが成功しても次のアドレスには何の許可も与えられません。例外が必要な場合は、プライベートネットワークを開放するよりも、allowedHostnamesに正確なホスト名だけを絞り込んで追加するほうが適切です。dangerouslyAllowPrivateNetworkは、意図して精査した環境でのみ使うべきものです。エージェントが実際に呼び出すツールについてはOpenClawのブラウザツールを、制御APIとコマンドラインの完全なリファレンスについてはブラウザ制御APIを参照してください。

Dialiでは

DialiはOpenClawをホスティングしているため、こんな夜を過ごすことはありません。各顧客は共有アシスタントの一部ではなく自分専用のアシスタントを動かし、実行時の設定はダッシュボードでの設定から生成され、リリースのたびに書き直されます。そのため、アップグレード後にサーバー上のopenclaw.jsonを修復する必要も、snapかdebかを選ぶ必要もありません。アシスタントが保持するものはすべて永続ボリュームに保存され、バックアップアドオン(Maxプランに含まれます)で毎日のスナップショットとワンクリック復元を利用できます。ホスティング環境の構成についてはDialiのマネージドOpenClawホスティングを、費用についてはDialiの料金をご覧ください。

  • apt install chromiumで入るのはブラウザではなく、snapのラッパーです。
  • まずは本物のChrome、次善策はattach-onlyとsystemdユニットです。
  • startとtabsは通るのにopenが失敗するなら、それはCDPではなくポリシーの問題です。
今すぐ始める

読むだけでなく、作ってみましょう

エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。