Salve o arquivo emacs sem acesso ao terminal

5

Estou tentando salvar o conteúdo de um buffer de rascunho do Emacs, que não consigo mais acessar devido a um terminal inacessível.

Na minha caixa Linux, eu ssh'ed para um servidor e iniciei o Emacs. Minha caixa do Linux está congelada, mas ainda consigo ver o processo do Emacs funcionando no servidor.

Existe uma maneira de fazer o Emacs despejar / salvar o conteúdo do zero sem ter acesso direto? Eu tive dois pensamentos:

  1. Envie um sinal ao processo para que o Emacs salve seu núcleo e, em seguida, recarregue o núcleo (e salve o risco)
  2. Envie pressionamentos de tecla ao stdin do processo que instruiria o processo do Emacs a salvar o arquivo, por exemplo: via echo "abd" > /proc/<pid>/fd/0 . Eu tentei isso abrindo dois terminais, e os toques de tecla aparecem no terminal de destino, no entanto, eles não são capturados pelo Emacs.
por Taras 25.11.2014 / 06:07

2 respostas

3

Eu tive alguma sorte em anexar o gdb ao processo em execução. Empréstimo pesado de: Como anexar terminal ao processo separado?

write-file

  1. mkfifo /tmp/some_name
  2. gdb -p [pid]
  3. (dentro do gdb): call close(0)
  4. (dentro do gdb): call open('/tmp/some_name', 0600) . Neste ponto, o gdb aparecerá para travar
  5. (do shell): echo '(write-file "savedresults")' > /tmp/some_name
  6. (dentro de gbd): ctrl-d

O conteúdo do rascunho é escrito no arquivo 'savedresults'. Curiosamente (write-file "savedresults") é anexado ao arquivo (não tem certeza do porquê).

Nome do C-x C-w

  1. mkfifo /tmp/some_name
  2. gdb -p [pid]
  3. (dentro do gdb): call close(0)
  4. (dentro do gdb): call open('/tmp/some_name', 0600) . Neste ponto, o gdb aparecerá para travar
  5. (do shell): cmd="^X^Wsavedresults" (entrada ^ X através da sequência de teclas: CTRL-V CTRL-X, semelhante para ^ W "
  6. (do shell): echo "$cmd" > /tmp/some_name
  7. (dentro de gbd): ctrl-d

Os conteúdos são gravados no arquivo 'savedresults'.

    
por 29.12.2014 / 02:42
3

O servidor Emacs

A melhor maneira de fazer isso é entrar em contato com o Emacs servidor e execute um comando Emacs Lisp.

emacsclient -e '(with-current-buffer "*scratch*" (write-file "~/scratch.txt"))'

Ou você pode anexar o Emacs ao terminal atual e fazer o que quiser, como mudar para o buffer ' scratch e salvar seu conteúdo.

emacsclient -nw

Infelizmente para você, você precisa iniciar o servidor explicitamente. Eu recomendo que você adicione (server-start) ao seu arquivo init, porque é muito útil, mas se você não tiver feito isso, não irá ajudá-lo agora.

Enviando entrada para o terminal do Emacs

Quando você executa echo "abd" > /proc/$emacs_pid/fd/0 , isso envia o texto para o terminal em que o Emacs está sendo executado. A gravação de dados em um terminal exibe esses dados. Você não pode enviar entrada para um terminal: entrada é o que vem de um terminal.

Tela

Se você executar um programa em uma tela ou tmux , você pode anexar a sessão existente e continuar interagindo com o programa. Tanto a tela quanto o tmux também suportam programaticamente enviar entrada para um programa rodando dentro dela. Isso requer que o programa seja executado em primeiro lugar, por isso não o ajudará dessa vez.

Com o Emacs, o Screen não vai te comprar muito ao se conectar ao servidor Emacs com emacsclient .

Core dump

Peneirar o core dump é uma opção. O Emacs armazena o conteúdo de um buffer em um único fragmento, com uma lacuna no meio (o espaço pode conter um lixo arbitrário; se a última operação for uma exclusão, é o que foi excluído).

O sinal SIGQUIT faz com que um processo morra e deixe um dump principal (se habilitado) por padrão. No entanto, o Emacs captura o SIGQUIT (ele sai para o nível superior, o que é conveniente em algumas situações, mas não ajuda você). Então, você precisará anexa a ele com um depurador e faz com que ele descarregue o core . Isso tem benefícios sobre o SIGQUIT de qualquer maneira: ele deixa o processo em execução e funciona mesmo se os dumps do núcleo estiverem desativados.

$ gdb -p $(pidof emacs)
(gdb) gcore

Você pode então filtrar o core dump para extrair os dados

Reconecte o Emacs a um novo terminal

Não há recurso Unix ou Linux para separar um programa de um terminal e anexá-lo em outro. No entanto, é possível anexar um depurador a qualquer programa e fazê-lo abrir um terminal diferente. Isso pode ser errado: às vezes funciona, às vezes trava o programa. Existem várias ferramentas que tentam fazer isso da melhor forma possível; veja Como posso deserdar um processo em execução e associá-lo a um novo shell de tela?

    
por 26.11.2014 / 00:03

Tags