Como definir o processo não será terminado quando o terminal parar

2

[Editar]

Simplifique.

Invoquei java xxx... na Máquina A usando massa para conectar da Máquina B. No entanto, não consigo acessar a Máquina B. Como posso conectar a Máquina A da Máquina C para definir o processo em execução java xxx... não pôde ser finalizado quando a Máquina B desliga?

[Original]

Estou conectando a um servidor (Máquina A) usando putty e estou executando um processo nele. No entanto, tenho que reiniciar meu computador (Máquina B), o que poderia terminar a conexão, bem como massa de vidraceiro. Como não defini nohup sobre o processo que estou executando, isso pode ser encerrado. Eu não posso usar putty para definir disown por alguns motivos. Então, eu quero usar a Máquina C para abrir massa para se conectar ao servidor (Máquina A) e definir o processo que estou executando que não será encerrado quando eu reiniciar a Máquina B.

Existe alguma maneira de fazer isso? Eu sei que posso usar disown se estou usando o mesmo processo de shell. Mas agora não é esse o caso.

    
por Marcus Thornton 26.05.2014 / 11:04

4 respostas

4

Você pode anexar um depurador a ele para fazer com que o processo ignore o sinal SIGHUP:

gdb --pid="$pid" --batch -ex 'call signal(1,1)' -ex detach

(onde $pid é o id desse processo). Você também pode estender isso para redirecionar seu stdout / stdin / stderr ..., mas então você pode também olhar para as outras questões referenciadas aqui sobre reconectar um processo a outro terminal (ou search para reptyr neste site ).

Outra opção seria suspender o processo que alocou e direcionará o pseudo-terminal que está controlando o seu processo java. Dessa forma, ele não morrerá mesmo se a conexão ssh for eliminada e, contanto que o java não grave muito no terminal, ele não será afetado.

Aqui, um teste com um processo sleep :

$ pstree -sp "$(pidof sleep)"
init(1)───sshd(5701)───sshd(62826)───sleep(62842)
$ kill -s STOP 62826

Agora termine o cliente ssh e, em seguida, sleep ainda está em execução:

$ ps -fC sleep
UID        PID  PPID  C STIME TTY          TIME CMD
root     62842 62826  0 09:50 pts/8    00:00:00 sleep 100

Você desejará retomar esse sshd quando seu processo Java for encerrado, para que ele possa sair corretamente.

    
por 26.05.2014 / 14:14
2

Eu queria dar uma chance ao comando kill com algum sinal específico, mas não achei e sinal adequado para fazer isso. Eu diria que você não pode fazer isso com coisas embutidas. Existem pessoas que escreveram código no entanto:

Como posso deserdar um processo em execução e associá-lo a um novo shell de tela?

    
por 26.05.2014 / 12:23
2

No seu caso, a melhor maneira de fazer isso é usar tmux ou screen

Aqui está um exemplo de como você pode usar tmux , a tela é praticamente a mesma.

  1. Putty no seu servidor
  2. instale o tmux usando seu gerenciador de pacotes favorito
  3. inicie uma nova sessão do tmux por: tmux
  4. execute seu aplicativo dentro da janela do tmux, por exemplo: java -jar blah blah
  5. separe sua sessão do tmux pressionando CTRL-B D
  6. da próxima vez que você quiser verificar o processo de java (mesma janela de massa ou de outro putty de máquina): tmux atta

Espero que esta ajuda.

    
por 30.05.2014 / 09:49
1

Como o seu comando já está em execução, você precisa pressionar CTRL-Z , que o levará a um estado parado, o programa não está em execução, mas o estado do programa é salvo e pode ser restaurado sempre que você desejar.

Você pode verificar qual ID de trabalho seu programa possui executando o comando jobs . Depois de identificá-lo, você poderá executar bg %your_prog_id , que enviará seu programa para segundo plano e continuará em execução, mesmo que você feche sua sessão. Agora, você pode sair e seu programa continuará em execução.

    
por 30.05.2014 / 10:41