Previne que a tarefa linux em execução seja morta após o logout do SSH

17

Eu tenho uma tarefa computacional em execução por alguns dias em um servidor linux via conexão SSH. Não está em segundo plano, portanto, a conexão SSH está sob controle da tarefa.

Desejo reiniciar a máquina local (não o servidor) a partir da qual abri a sessão ssh, mas quero manter a tarefa em execução. Isso é possível?

    
por Ali 03.11.2014 / 17:53

4 respostas

21

Se sua tarefa já foi lançada, é tarde demais * para considerar soluções alternativas que inserem uma camada adicional entre a sessão ssh e o shell executando o comando, como screen , tmux , byobu , nohup e os gostos.

Se o suporte do seu processo for colocado em segundo plano e particularmente não travar quando stdout e stderr forem unwritable / closed, você poderá colocá-lo em segundo plano antes de efetuar logout com Control Z e bg , em seguida, desanexá-lo do seu shell com o disown incorporado.

por exemplo:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

* Como Bob comentou, na verdade existem várias maneiras de reparar uma sessão tty no Linux. repty, retty , injcode e neercs . O mais avançado parece ser reptyr mas você pode precisar de privilégios de root para permitir que o ptrace hackeie seu processo.

    
por 03.11.2014 / 18:01
5
Uma solução é usar a tela GNU . Você pode inicializar screen , executar seu comando e, em seguida, desanexar com C-a d . Mais tarde, para se reconectar, faça screen -r , e você está de volta à sua sessão anterior.

Outros benefícios da tela são o gerenciamento de janelas (assim você pode alternar para outros shells enquanto seu comando está em execução, sem precisar de uma nova conexão SSH) e permite que seu comando permaneça em primeiro plano, seja na sessão atual ou mais tarde um.

Editar: Conforme observado nos comentários, isso só funcionará se você lembrar de iniciar screen antes de executar o comando. Se o comando já estiver em execução, você precisará da solução @ jlliagre.

    
por 03.11.2014 / 18:03
1

Uma das formas "padrão" de fazer isso é usar o comando nohup , incluído em coreutils , assim:

nohup COMMAND [ARGS] &

Mas o comando irá redirecionar a saída ( STDOUT & STDERR AFAIK) do programa para um arquivo nohup.out , tornando-o um pouco irritante às vezes (como gerar um arquivo de log enorme), então você pode querer faça seu próprio redirecionamento, ou redirecione-o para / dev / null se quiser.

    
por 03.11.2014 / 21:24
0

Além de nohup , você pode iniciar o processo em segundo plano usando "&" e subshell:

Sufixe o comando com & e embrulhe entre parênteses

$ (thecommand args &)

Digamos que seu processo ganhe o pid 1922:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

Observe que ele está desassociado do processo de shell 11473, que era seu pai original. Portanto, se você sair ou eliminar o shell atual (11473), o processo 11922 continuará em execução e será desconectado dos pts.

Tente sair do shell e entrar em um novo shell. Mesmo se, este shell estiver conectado aos mesmos pts, você pode ver o processo agora sem um pts:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Eu não sei como é chamado ou documentado no Posix, mas eu uso dessa forma desde 1990 em bsh, ksh e agora no bash.

Por fim, você pode usar o comando shell bg builtin:

Basta iniciar o programa e, se decidir pausar ou planejar mantê-lo em segundo plano, digite CTRL + Z:

$ thecommand
^Z
[1] Stopped          thecommand

Agora, continue a ser executado em segundo plano:

$ bg
[1]+ thecommand &

Se você observar as informações do processo, ainda terá um processo pai:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

Então, saia do processo atual. O processo em execução em segundo plano é desvinculado de seu pai original e continua sendo executado em segundo plano:

$ exit

Faça login novamente e veja as informações do processo:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
    
por 20.10.2016 / 20:10