Como manter uma 'tela' com o emacs? Se eu matar o buffer com o emacs, eu mato o processo? [fechadas]

2

Estou executando algum código R com uma sessão R.

Começo abrindo o shell, digitando screen para iniciar uma sessão de tela e, em seguida, emacs -nw

Digamos que eu comece o R com R e, em seguida, execute algum código, por exemplo, > source("script.R")

Como faço para sair dessa sessão e manter esse código R em execução? Se eu estiver usando screen e eu matar o buffer com C-x k , eu mato a sessão?

    
por ShanZhengYang 15.09.2016 / 01:19

4 respostas

3

Se você fechar o emacs, o processo R será eliminado. Para mantê-lo funcionando, separe sua sessão de tela sem fechar o emacs. Eu acho que isso está vinculado a C-a d por padrão.

No seu exemplo, você começa abrindo screen em um terminal:

screen

Em seguida, inicie o emacs, usando -nw para executá-lo no modo de texto:

emacs -nw

Se você tiver o ESS instalado, inicie o R via M-x R . Se você está apenas executando-o em um shell (por que? Usar o ESS!), Faça isso.

Agora comece sua análise. Por exemplo:

for(i in 1:100){
  Sys.sleep(5)
  print(i)
}

Agora, desanexe a sessão com C-a d . Agora você pode fechar seu terminal e até mesmo fazer logoff do seu computador - mas não o desligue! Quando você quiser ver como seu trabalho está, abra outro terminal, chame a tela com o sinalizador -r :

screen -r

E você verá que sua sessão R, dentro do Emacs, ainda está funcionando:

> Sys.sleep(4)
> for(i in 1:100){
+ Sys.sleep(5)
+ print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8

Desde que você deixe o emacs e R em execução, e desconecte (mas não feche) a tela, e não desligue o computador, isso é tudo que você precisa.

    
por 15.09.2016 / 01:54
2

A tela é um multiplexador de terminal, em seguida, tem um modelo de servidor / cliente. Quando você inicia a tela, ele se bifurca em segundo plano para iniciar o servidor e, em seguida, o cliente em primeiro plano começa a se comunicar com ele. O que isto faz é permitir que ele continue rodando em segundo plano, não importa o que aconteça ao seu cliente (seja ele morto, você perderá a conexão se estiver rodando sobre o ssh ou qualquer outra coisa).

Para separar o cliente de tela do servidor pressionando crtl + a seguido por d . Você pode usar screen -ls para listar todas as sessões da tela de execução e screen -r para anexar à última.

No entanto, se você está rodando o R dentro do emacs dentro da tela, então o emacs é quando fechar o programa R, a tela não tem nada a dizer.

A tela também permite dividir a janela e ter várias janelas. Você pode usar isso em vez de iniciar o aplicativo com o emacs para mantê-lo em execução, mesmo quando você sair do emacs.

    
por 15.09.2016 / 02:01
2

Se esta é a única janela que você tem, matar essa janela também irá matar screen . Contanto que você tenha uma janela aberta, screen ainda deve estar em execução. Por exemplo, você pode estar executando R em outra janela.

Mas geralmente quando você mata uma janela, o que está nela também pára, porque screen envia um sinal:

Kill current window. If there is an exec command running then it is killed. Otherwise the process (shell) running in the window receives a HANGUP condition, the window structure is removed and screen (your display) switches to another window. When the last window is destroyed, screen exits. After a kill screen switches to the previously displayed window. Note: Emacs users should keep this command in mind, when killing a line. It is recommended not to use "C-a" as the screen escape key or to rebind kill to "C-a K".

Se você estiver executando R em um buffer do Emacs, (não tendo tomado providências para colocá-lo em segundo plano e / ou não usando nohup ) então matar a janela do Emacs levaria R junto com ela.

Você pode, claro, separar-se de uma sessão de tela (que é diferente de matar uma janela): controle + A < kbd> d

Mas ajuda a ler a página de manual

    
por 15.09.2016 / 01:22
2

Você está executando um shell no Emacs? Nesse caso, você pode usar o controle de tarefa do Unix para colocar o script R em segundo plano: Quando o script R estiver em execução, digite Ctrl-C Ctrl-Z para retornar ao prompt do shell. Isso irá suspender seu script. Em seguida, digite bg para reiniciar o trabalho que você acabou de suspender no segundo plano. Você pode ver que o trabalho está sendo executado em segundo plano usando o comando shell jobs .

Outra maneira de realizar o que você deseja é começar seu script R em segundo plano desde o início. Consulte este link para fazer isso em R ou este link para fazer diretamente a partir da linha de comando.

    
por 15.09.2016 / 02:25