É possível colocar o processo de primeiro plano em segundo plano sem suspender (controle + z)?

9

Estou executando um aplicativo que recebe pacotes TCP e UDP e, portanto, não pode ser suspenso. Inicialmente, executei 3 processos do mesmo aplicativo, com diferentes argumentos, em modo de segundo plano usando & . Quando eu fiz apenas $fg , todos os três processos entraram em primeiro plano. Agora eu quero enviá-los para o fundo novamente, mas sem suspensão. Como posso fazer isso?

    
por rahul.deshmukhpatil 15.05.2013 / 09:12

3 respostas

10

Primeiras coisas primeiro: só pode haver um processo em primeiro plano, não todos os três. fg traz o processo mais recente para primeiro plano. Para fazer o processo de Ctrl + z , digite bg mais rápido para não "perturbar" a aplicação em questão (note que o agendador de processo fará isso de qualquer maneira muitas vezes por segundo), descubra o PID do processo em primeiro plano e, em seguida, em uma segunda sessão de terminal / SSH, use

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Seu terminal original dirá stopped , mas desde que você enviou um SIGCONT imediatamente, o processo continuará sendo executado em segundo plano.

    
por 15.05.2013 / 09:47
2

Se você realmente tem um trabalho de primeiro plano, então o bash está esperando que ele seja concluído, isso é mais ou menos o definição de um trabalho em primeiro plano . Se o bash ainda tiver o controle do terminal, verifique o que está acontecendo com jobs -l , por exemplo:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Eu iniciei três processos de audição background ncat para isso. Você também pode ver "Concluído" ou "Parado" para um status de trabalho.

Você pode efetivamente fazer o background de um trabalho de primeiro plano a partir de um shell diferente usando o método SIGSTOP / SIGCONT de Stefan Seidel (embora o sinal real enviado por um shell com Ctrl - Z é SIGTSTP, qualquer sinal deve funcionar ).

Há uma distinção sutil entre processos e empregos quando os termos primeiro plano e segundo plano são usados. Existe apenas um trabalho em primeiro plano , pode haver vários processos em primeiro plano (isto está relacionado com IDs de grupos de processos terminais , e pode ser observado quando você inicia dois ou mais processos em um pipeline).

Um processo em execução ou pipeline sob o controle do shell é chamado de "job", quando você usa o comando bg ou fg você está implicitamente referenciando o mais recente job - no meu caso, aquele com o + no acima. Esses trabalhos também podem (entre outras coisas) ser referidos explicitamente como% 1% 2 ou% 3 (o número em [] ).

Um comando fg não qualificado afetará apenas um trabalho, o mais recente, para que você possa estar equivocado em sua compreensão da situação atual. Um trabalho em segundo plano pode ainda gravar no terminal:

  echo foo > /dev/tcp/127.0.0.1/10111

Pode depender de como o programa manipula o terminal, ncat funciona bem para gravação. Para ler embora os programas parem a execução, você verá uma mensagem "Parado". O shell iniciará processos e aguardará que eles saiam ou recebam um sinal SIGTTIN ( nohup é uma maneira de contornar isso, assim como disown ).

Você pode trabalhar em segundo plano em um trabalho interrompido específico com

$ bg %3

(no meu caso eu vou receber o erro bash: bg: job 3 already in background )

Caso contrário, se um processo estiver em primeiro plano, a menos que o programa capture SIGTSTP e faça algo especial, é improvável que ele tenha problemas com um Ctrl - Z e% co_de rápidos %. Não há nada de especial sobre os programas de rede a esse respeito, conexões / dados de entrada serão armazenados em buffer pelo kernel (até certo ponto). Uma conexão de streaming pode ter uma pausa observável.

Consulte a seção " CONTROL DE TRABALHO " da página do manual bash para mais detalhes.

    
por 15.05.2013 / 13:35
1

A maneira mais fácil de fazer isso é usar o programa tela . Você pode iniciar seu aplicativo no terminal virtual e sair da tela com Ctrl + A, D. Se você quiser retomar sua sessão, digite screen -x . Se você tiver vários processos, será apresentada uma lista de telas para anexar. Para mais detalhes, leia a página de manual da tela .

    
por 15.05.2013 / 09:30

Tags