Processo do Linux para o segundo plano - relogin - como trazer o processo de volta ao primeiro plano?

4

Eu inicio um processo, coloco em segundo plano em execução, faço logout, faço login novamente e quero trazer o processo para frente novamente. Eu olhei em "ps aux" para o PID, mas não será colocado em primeiro plano com "fg ###". Qual é o caminho correto?

(eu uso a mesma conta para ambas as sessões de login.)

    
por Jonny 09.02.2010 / 06:00

2 respostas

10

A maneira mais comum de fazer isso é provavelmente com a tela GNU .

Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells.

Basicamente você irá:

  • Verifique se screen está instalado. Normalmente, este é o pacote ' screen ' na maioria das distribuições Linux. Ele é instalado por padrão no Mac OS X.
  • Executar screen

  • Execute o programa que você deseja 'background'. Por exemplo, começo a seguir um arquivo de log:

  • PressioneCtl-a,dparadesanexaratela.

  • Saia,façaoutrascoisas,oquequiser.Aqui,vouenviarumamensagemparaolog.

  • Quando você fizer login novamente, digite screen -r para reconectar a sessão que estava executando antes. Aqui você pode ver a mensagem que enviei para o log (e um teste anterior também).

AtelaéconsideradapormuitoscomoumaferramentapoderosanoLinux/Unix,eestouinclinadoaconcordar!

Paraobtermaisinformaçõessobreatela,consulteapáginainicialouoartigodetalhadoem Ars Technica .

    
por 09.02.2010 / 06:43
4

AFAIK, não há um caminho direto para colocar em primeiro plano um processo que tenha sido iniciado e passado em outro shell. Existem algumas maneiras de contornar isso, no entanto.

A melhor maneira é usar a tela GNU . Inicie uma sessão de tela, inicie seu processo, desconecte-se da sessão de tela, efetue logout, conecte-se novamente, reconecte-se à sessão de tela. O processo ainda está em execução e a tela mantém qualquer saída nos buffers da janela. Você nem precisa de fundo; você pode deixá-lo rodando em uma janela de tela e usar outras para outras tarefas.

A maneira feia é desligá-lo do terminal antes de sair. No bash, disown -h %[jobid] faz isso; outras shells como o tcsh fazem isso automaticamente para processos em segundo plano quando você sai do shell. (Obtenha o $[jobid] executando o comando jobs .) Você não pode reconectar-se ao processo diretamente, mas se tudo que você precisa é stdout / stderr / stdin de um processo, você pode usar o GDB para fingir a reconexão. Esta é uma forma parcial de desta fonte (originalmente incluída em outra resposta ):

[...] with some dirty hacks, it is not impossible to reopen a process' stdout/stderr/stdin.

So you could still create a blank screen window (for instance that runs sleep).

And then use gdb for instance to attach to the process, do some call close(0)
call close(1)
call close(2)
call open("/dev/pts/xx", ...)
call dup(0)
call dup(0)
detach

The process' output would go to screen. It wouldn't be attached to that screen terminal, so for instance[sic] would kill the "sleep" command, not the process, but that could be enough for the OP.

Existem algumas maneiras de fazer bash fazerem as devoluções automáticas , mas elas envolvem < em> shopts ou nohup ou outros truques bash para evitar o SIGHUP automático. O bash não é tão elegante quanto o tcsh nessa área, e você precisa saber antecipadamente que precisará disso para configurar a opção. É um pouco mais fácil lembrar-se de executar rejeição em seu trabalho em segundo plano antes de sair.

    
por 09.02.2010 / 06:50

Tags