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

11

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 argumentos diferentes, no modo background usando &. Quando eu fiz apenas $fg, todos os três processos entraram em primeiro plano. Agora, quero enviá-los para segundo plano novamente, mas sem suspensão. Como eu posso fazer isso?

rahul.deshmukhpatil
fonte
Aqui é um tópico ServerFault sobre mover um processo em execução para uma nova instância de tela -> serverfault.com/questions/55880/...
Alan Barber

Respostas:

10

Primeiras coisas primeiro: só pode haver um processo em primeiro plano, não os três. fgcoloca o processo mais recente em primeiro plano. Para tornar o processo de Ctrl+ ze digitar bgmais rápido para não "perturbar" o aplicativo em questão (observe que o agendador de processos fará isso de qualquer maneira várias vezes por segundo), descubra o PID do processo em primeiro plano e depois em um segundo terminal / SSH, use

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

O seu terminal original dirá stopped, mas desde que você enviou uma mensagem SIGCONTimediatamente, o processo continuará sendo executado em segundo plano.

Stefan Seidel
fonte
11
@stefen: sua solução é convincente. Isso não prejudicará meus processos de nenhuma maneira, assumindo que, se suspendermos o processo, as conexões de soquete estabelecidas não quebrarão (a alternância do agendador não desconecta a conexão de soquete, tenho certeza disso). Depurará isso e atualizará. Muito obrigado. Se
rahul.deshmukhpatil 16/05
2

Se você realmente tem um trabalho em primeiro plano, o bash aguarda a conclusão, que é mais ou menos a definição de um trabalho em primeiro plano . Se o bash ainda tiver o controle do terminal, verifique o que está acontecendo 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 &

Comecei três ncatprocessos de escuta em segundo plano para isso. Você também pode ver "Concluído" ou "Parado" para um status de trabalho.

Você pode efetivamente colocar em segundo plano um trabalho em 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- Zseja SIGTSTP, ambos os sinais devem funcionar).

Há uma distinção sutil entre processos e tarefas quando os termos primeiro plano e plano de fundo são usados. Há apenas um trabalho em primeiro plano do shell , pode haver vários processos em primeiro plano (isso está relacionado aos IDs do grupo de processos do terminal 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 "trabalho", quando você usa o comando bgou, fgestá implicitamente se referindo ao trabalho mais recente - no meu caso, o que está +acima. Esses trabalhos também podem (entre outras coisas) ser explicitamente referidos como% 1% 2 ou% 3 (o número em []).

Um fgcomando não qualificado afetará apenas um trabalho, o mais recente; portanto, você pode estar enganado ao entender a situação atual. Um trabalho em segundo plano ainda pode gravar no terminal:

  echo foo > /dev/tcp/127.0.0.1/10111

Pode depender de como o programa lida com o terminal, ncatfunciona bem para escrever. Para ler, porém, os programas interromperão a execução e você verá a mensagem "Parado". O shell iniciará os processos e esperará que eles saiam ou recebam um sinal SIGTTIN ( nohupé uma maneira de contornar isso, como está disown).

Você pode colocar em segundo plano um trabalho parado específico com

$ bg %3

(no meu caso, receberei o erro bash: bg: job 3 already in background)

Caso contrário, se um processo estiver em primeiro plano, a menos que o programa pegue o SIGTSTP e faça algo especial, é improvável que tenha problemas com um rápido Ctrl- Ze bg. Não há nada de especial nos programas de rede a esse respeito, as conexões / dados recebidos 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 " CONTROLE DE TRABALHO " da página de manual do bash para obter mais detalhes.

mr.spuratic
fonte
1

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

Janos Pasztor
fonte
5
Eu acho que ele está procurando uma solução "após o fato", ou seja, os processos estão em execução no momento.
Stefan Seidel