Transferir o comando atual para uma sessão destacável (tmux / screen)

41

Atualmente, estou executando um backup e agora ele precisa ser transferido para um destacável, como em tmuxou screen. Existe uma maneira de fazer isso quando o comando está sendo executado atualmente?

Eu posso enviar o comando em segundo plano pressionando Ctrl+ Ze colocá-lo novamente, emitindo um fgcomando. mas não sei se essa sessão pode voltar quando eu sair do terminal.

Jürgen Paul
fonte
11
Não há como fazer isso. É necessário iniciar o comando em uma sessão de tela (ou outra) para que ele seja destacável.
Dan D.

Respostas:

45

Isso funciona, na maioria das vezes:

Pré-requisitos: ter reptyre tmux/ screeninstalado; você poderá encontrá-los com apt-getou yum, dependendo da sua plataforma.

  1. Use Ctrl+ Zpara suspender o processo.

  2. Continue o processo em segundo plano com bg

  3. Encontre o ID do processo em segundo plano com jobs -l

    Você verá algo semelhante a este:

    [1]+ 11475 Stopped (signal) yourprocessname
    
  4. Rejeitar o trabalho do pai atual (shell) com disown yourprocessname

  5. Iniciar tmux(preferencial) ou screen.

  6. Reconecte o processo à sessão tmux/ screencom reptyr:

    reptyr 11475
    
  7. Agora você pode desconectar o multiplexador (padrão Ctrl+ B, Dfor tmuxou Ctrl+ A, Dfor screen) e desconectar o SSH enquanto o processo continua em tmux/ screen.

  8. Mais tarde, quando você se conectar ao SSH novamente, poderá conectar-se ao seu multiplexador (por exemplo tmux attach).

Ville
fonte
2
Infelizmente, depois de correr sudo reptyr 1430, ainda recebi: "... [-] Incapaz de abrir o tty na criança. Incapaz de anexar ao pid 1430: Permissão negada"
Daryl Spitzer
3
Você pode encontrar algum sucesso com a opção -L, por exemplo, reptyr -L 1430 no seu caso.
precisa saber é o seguinte
11
Execute isso quando necessário:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Yanhao
É também na Arch via yo: archlinux.org/packages/community/i686/reptyr (não apt-get ou yum)
Tommy
11
Depois bg, o processo deve ser em execução em segundo plano, por isso jobsdeve dizer Running, em vez de Stopped.
G-Man diz 'Reinstate Monica'
2

reptyr é bom, mas recebi um erro de permissão

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Então encontrado
-L Like '-l', but also redirect the child's stdio to the slave.

que funcionou como um encanto

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
fifi finanças
fonte
2
Quando adicionei o -L, recebi uma mensagem como a sua dizendo, Opened a new pty: /dev/pts/6mas meu suspenso topnão apareceu no tmux. O que estou perdendo aqui?
Mehrad Mahmoudian
-1

você pode usar disown para desanexar o trabalho de seu terminal, se esse comando estiver disponível.

No entanto, é mais seguro executá-lo com nohup.

johnshen64
fonte
Você pode expandir isso? O que você quer dizer com começar nohup? Como funciona disowningum processo?
Darth Android
disown desanexa o processo em segundo plano (que você coloca em segundo plano com control-z) do terminal, para que o processo continue após o término do terminal. você pode digitar disown após control-z, se o comando for encontrado. no entanto, isso é teoricamente e pode não funcionar de maneira confiável. da próxima vez, é mais seguro adicionando nohup na frente do seu programa para que você possa sair do terminal com segurança.
johnshen64
Eu descobri que 'renegar' não é confiável, como mencionado. nohup não é realmente muito melhor. reptyr pode ser uma solução no entanto. github.com/nelhage/reptyr
anastrophe
Isso não responde à pergunta. A questão não é apenas "como fecho o terminal sem interromper o backup", mas "como o retomo mais tarde". Para a qual a resposta correta é "você não pode".
Gabe
Vejo um possível desacordo semântico aqui, e este é um resultado de pesquisa bastante popular para palavras-chave como 'relocável', 'independente de posição', 'desanexar tmux' etc. etc., portanto, espero que você possa perdoar o necro-post. Você quis dizer "você não pode" por causa do mapeamento de memória diferente entre interromper e reiniciar o programa? Um programa de backup saberá apenas quais arquivos serão salvos de backup pela estrutura de arquivos fornecida, e a estrutura de arquivos existe para tornar essa memória física mapeável no futuro. (Estamos de volta para a ocasião que não faz!)
John P