Movendo um processo já em execução para Screen

222

Meu trabalho no escritório rotineiramente me vê conectado a uma caixa Linux via VNC.

Às vezes, inicio um trabalho remoto no console e percebo mais tarde que ele executa muito mais tempo do que o esperado. (Deveria ter iniciado aquele em Tela em primeiro lugar ...)

Não quero manter minha estação de trabalho em funcionamento durante a noite apenas para manter a sessão do VNC aberta; Gostaria de mover esse trabalho remoto já em execução para uma sessão Screen (na caixa remota), para poder desligar a estação de trabalho (e reconectar na manhã seguinte).

Como isso pode ser feito?

DevSolar
fonte
2
e é uma bobagem, serverfault.com/questions/49877/… - parece que não pode ser feito.
22711 Paul Dixon
Procure pelo script screenify.
Vashu 27/02

Respostas:

217

Dê uma olhada no reptyr , que faz exatamente isso. A página do github tem todas as informações.

reptyr - Uma ferramenta para "re-escrever" programas.

reptyr é um utilitário para pegar um programa em execução existente e anexá-lo a um novo terminal. Iniciou um processo de execução demorada pelo ssh, mas precisa sair e não quer interrompê-lo? Basta iniciar uma tela, use reptyr para pegá-la e, em seguida, mate a sessão ssh e vá para casa.

USO

reptyr PID

"reptyr PID" irá capturar o processo com o ID PID e anexá-lo ao seu terminal atual.

Após a conexão, o processo recebe e grava a saída no novo terminal, incluindo ^ C e ^ Z. (Infelizmente, se você tiver experiência em segundo plano, ainda precisará executar "bg" ou "fg" no terminal antigo. É provável que seja impossível corrigir isso de uma maneira razoável sem corrigir o shell.)

DaveJohnston
fonte
22
Se, como eu, você olhou para o link acima e considerou brevemente instalar o programa a partir da fonte, lembre-se: é apenas uma questão de apt-getdistância nos sistemas Debian.
mlissner
3
Isso funciona muito bem, como eu nunca vi isso antes?
deed02392
3
Isso é incrível! Eu votaria 10 vezes se pudesse! Além disso, o reptyr também está disponível nos repositórios RedHat. Apenas 'yum install' para obtê-lo.
Mark J. Bobak
5
Não funciona, exceto nos casos mais triviais:Unable to attach. (This most commonly means that 11690 has a suprocesses)
Mehrdad 13/08
2
Pelo menos como root, você pode usar #reptyr -T PID
ChristophK
45

Você não pode fazer isso facilmente. Eu sugeriria criar o hábito de iniciar a tela como a primeira coisa que você faz depois de abrir um console.

No entanto, para o seu problema real, há outra coisa que você pode tentar: depois de iniciar o seu trabalho a partir do terminal, coloque-o em segundo plano digitando ctrl-z e depois bg. Depois disso, desanexe o trabalho do seu shell pai; na festança você faria disown -h %<jobid>. Depois disso, você pode fechar o terminal com segurança e o trabalho continuará sendo executado.

conde
fonte
3
Isso funcionou muito bem para o meu caso. reptyr e retty falharam ao pegar o processo, mas tudo o que eu precisava era poder fechar um terminal e deixar o processo em execução.
STW
10
FYI: depois de renegar ing o processo pode ser reptyr -ed dentro da tela .
Adam
1
Isso matou meu programa em execução :(
Mehrdad
39

Ao usar o Linux, que tal usar retty dentro do processo de tela recém-lançado?

$ screen -S my_process
$ retty $(pgrep my_process)
/redraw

HTH

Felicidades,

Rob Wells
fonte
1
Não sabia de retty, obrigado. No entanto, para o tipo de trabalho de longa duração que tenho em mente, estou um pouco relutante em usar uma ferramenta que se refere a si mesma como "muito levemente testada". Eu vou com a solução do conde.
1
não vejo retty no Gentoo
Sergei
não pode anexar ao 4858
Arnold Roa