端末にアクセスできず、アクセスできなくなったEmacsスクラッチバッファの内容を保存しようとしています。
私のLinuxマシンでは、SSH経由でサーバーに接続し、Emacsを起動しました。私のLinuxボックスは今停止されていますが、SSHを介してサーバー上でアクティブなEmacsプロセスを見ることができます。
Emacsに直接アクセスせずに一時コンテンツをダンプ/保存する方法はありますか?私は2つのアイデアを持っています:
- Emacsがコアをダンプし、コアを再ロードするようにプロセスにシグナルを送信します(その後、ステージングを保存します)。
- プロセスの標準入力にキーストロークを送信し、Emacsプロセスにファイルを保存するように指示します(例:via)
echo "abd" > /proc/<pid>/fd/0
。 2つの端末を開こうとしましたが、ターゲット端末にキーストロークが表示されましたが、Emacsはそれをキャッチできませんでした。
答え1
実行中のプロセスにgdbをリンクする幸運がありました。以下で大量の借入が発生しました。分離したプロセスに端末を接続するには?
ファイルの書き込み
mkfifo /tmp/some_name
gdb -p [pid]
- (gdb内):
call close(0)
- (gdb内部):.
call open('/tmp/some_name', 0600)
このときgdbは停止します。 - (シェルから):
echo '(write-file "savedresults")' > /tmp/some_name
- (GBD内):
ctrl-d
スクラップの内容は「savedresults」ファイルに書き込まれます。興味深いのは、(write-file "savedresults")
ファイルに追加することです(理由はわかりません)。
Cx CW名
mkfifo /tmp/some_name
gdb -p [pid]
- (gdb内):
call close(0)
- (gdb内部):.
call open('/tmp/some_name', 0600)
このときgdbは停止します。 - (シェルから):(
cmd="^X^Wsavedresults"
キーシーケンスを介して^ Xを入力:CTRL-V CTRL-X、^ W」に類似 - (シェルから):
echo "$cmd" > /tmp/some_name
- (GBD内):
ctrl-d
内容は「savedresults」ファイルに書き込まれます。
答え2
Emacsサーバー
最良の方法は連絡することです。EmacsサーバーEmacs Lispコマンドを実行してください。
emacsclient -e '(with-current-buffer "*scratch*" (write-file "~/scratch.txt"))'
あるいは、Emacsを現在の端末に接続して `に切り替えるなど、必要な操作を実行できます。傷跡内容をバッファリングして保存します。
emacsclient -nw
残念ながら、サーバーを明示的に起動する必要があります。非常に便利なので、それを初期化ファイルに追加することをお勧めします(server-start)
。しかし、まだ行っていない場合は、今は役に立ちません。
Emacs端末に入力を送信する
これを実行すると、echo "abd" > /proc/$emacs_pid/fd/0
Emacsが実行されている端末にテキストが送信されます。端末にデータを書き込むとデータが表示されます。入力を送信できません到着端末:入力した内容が表示されます。~からターミナル。
画面
であれば画面またはマルチプレクサセッションを使用すると、既存のセッションに接続し、プログラムと引き続き対話できます。 screen と tmux は、プログラムで内部で実行されるプログラムに入力を送信することもサポートします。しかし、最初にプログラムを実行する必要があるので、今回は役に立ちません。
Emacsの場合、Screenはemacsclient
。
コアダンプ
コアダンプのフィルタリングはオプションです。 Emacsはバッファの内容を単一のブロックに格納し、その間にスペースがあります。スペースには任意のゴミを含めることができます。最後のジョブが削除の場合は削除された内容です。
デフォルトでは、SIGQUIT信号はプロセスを終了し、コアダンプを残します(有効になっている場合)。しかし、EmacsはSIGQUITをトラップします(最上位レベルに出るので、場合によっては便利ですが役に立ちません)。だからあなたは必要ですデバッガを使用して接続し、コアをダンプします。。とにかく、これはSIGQUITに比べて利点があります。つまり、コアダンプが無効になってもプロセスを実行し続けます。
$ gdb -p $(pidof emacs)
(gdb) gcore
それではあなたはできます。コアダンプのフィルタリングデータ抽出
Emacsを新しい端末に再接続する
Unix や Linux にも、ある端末からプログラムを分離し、別の端末に接続する機能はありません。ただし、すべてのプログラムにデバッガを接続して他の端末を開くようにすることは可能です。これは偶然かもしれません。動作する場合もあり、プログラムがクラッシュする場合もあります。これを可能にするいくつかのツールがあります。実行中のプロセスを拒否し、それを新しいスクリーンシェルに接続する方法は?