web-dev-qa-db-ja.com

emacsclient接続が拒否されました

Emacsをデーモンモードで実行していますが、それが実行されていたサーバーから切断されました。再接続後、実行すると

emacsclient -nc

エラーが発生します

ローカルホストポート6012に接続:接続が拒否されました

[〜#〜] error [〜#〜]:Display localhost:12.0を開くことができません

デーモンはまだ実行されているようですが、接続方法がわかりません。何か提案はありますか?

関連する場合と関連しない場合があるその他の楽しい事実:

スクリーンセッションを介してヘッドノードに接続し、次にサーバーの別のサイドノードに接続します。

私はこのセットアップを数日間実行していて、通常は問題なく再接続できます。

デーモンを再起動するだけでよいと確信していますが、matlab-emacsを介してインターフェイスしている実行中のmatlabジョブに接続されているため、作業セッションを回復したいと思います。

編集:私はGillesの提案を試しましたが、まだ問題が発生しています

echo $DISPLAY

戻り値

localhost:18.0

スクリーンセッションに入って走った

export DISPLAY=localhost:18.0

スクリーンセッション内でecho $ DISPLAYを再度実行しました

localhost:18.0

Emacsclient-ncは

[〜#〜] error [〜#〜]:ローカルホストを表示:18.0を開くことができません

これは、スクリーンセッションを実行しているマシンで使用されているのと同じディスプレイですが、それでも接続はありません。

私も試したことに注意してください

 export display=localhost:18

edit2:私のシステムアーキテクチャに関するメモ私のオフィスにある私のラップトップは、sshを介してサーバー「Host1」に接続されています。 Host1には多数のノードコンピューターがあります。最初にスクリーンセッションを作成するか、ログインします

 screen -S ohnoplus-five

次にnode005に接続します

ssh node005

次に、node005からログアウトせずに画面から切り離し、

screen -r ohnoplus-5

host1から

Gillsの提案に応えて、export DISPLAY = localhost18.0を実行しました。これは、ローカルラップトップではなく、Host1でecho $ DISPLAYによって返される表示です。

3
ohnoplus

リモートGUI(X11)接続 通過TCPポート6000 +nwherenはディスプレイ番号¹です。したがって、2つのメッセージは同じ問題を示しています。一部のプログラムがディスプレイ12に接続しようとして失敗しました。

EmacsclientはX11接続を行いませんが、Emacsは行います。したがって、このメッセージが表示された場合は、EmacsclientがEmacsに接続し、新しいフレームを開くように指示したことを意味します。 Emacsclientは、X11ディスプレイが使用可能であると判断した場合はGUIフレームを要求し、そうでない場合は端末フレームを要求します。 DISPLAY環境変数が設定されている場合、EmacsclientはX11ディスプレイが使用可能であると見なします。

DISPLAY環境変数は、X11接続をローカルマシンに転送するときにSSHによって自動的に設定されます。ただし、既存のScreenセッションに接続すると、DISPLAY変数を含むScreenセッション内で設定された環境が取得されます。切断して再接続した場合、表示番号が同じである保証はありません²。

DISPLAY変数を更新するには、Screenセッションから切り離し、echo $DISPLAYを実行してSSHによって設定された値(例:localhost:13)を確認してから、Screenセッションに再接続してexport DISPLAY=localhost:13(または正しい番号が何であれ)。 Screenセッションに複数のウィンドウがある場合は、それぞれのウィンドウで行う必要があります。新しいウィンドウを作成する場合は、次のように入力します Ctrl+A: setenv DISPLAY localhost:13` Enter 新しいウィンドウのために、Screen自体に環境変数を設定します。

必要に応じて、DISPLAYの設定を解除するか、emacsclient -nwを実行して、ターミナルフレームを開くことができます。

¹ SSHは、10から始まるディスプレイ番号を使用し、ローカルディスプレイには0〜9の番号のみを残します。典型的な状況では、ディスプレイ12は、これがSSHを介して開かれた3番目のGUI接続であることを意味します。
² 実際、ネットワークの問題が原因で切断されたが、すぐに再接続された場合、リモートマシンがネットワークの問題にまだ気付いていない可能性があります。クライアントが何かを送信してからしばらく経っていることがわかっていますが、それは通常の非アクティブ状態—この場合、リモートマシンに関する限り、ディスプレイ12は引き続き使用されます。


複数のSSHホップがあり、ローカルマシンから中間マシンへの接続が中断されて再開された場合、再開すると、中間マシンの表示番号は変更されますが、中間マシンから最終マシンへのSSH接続は引き続き行われます。元の表示番号を転送します。

このシナリオでは、最終マシンでのみScreenを実行し、中間マシンを proxy として使用した場合が最も簡単です。追加

Host node[0-9]*
ProxyCommand ssh -W %h:%p Host1

~/.ssh/configに移動し、ssh node005を実行します。そうすれば、中間マシンについて心配する必要はありません。

中間マシンでScreenを実行する必要がある場合は、DISPLAY変数を更新した後、Host1からnode005へのSSH接続を再起動する必要があります。 (TCP接続を古い表示番号から新しい表示番号に転送することもできますが、それは古い表示番号がその間に再利用されていない場合にのみ機能します。)