Coloque o trabalho em segundo plano sem congelamento

9

Digamos que você comece o trabalho assim

foo

e então deseje que você queira colocá-lo em segundo plano. Digitar Ctrl+ Ze, em seguida, bgexecuta o truque, mas congelará fooentre Ctrl+ Ze bg. Como posso colocar foo em segundo plano sem congelá-lo primeiro?

user877329
fonte
7
Qual é o caso de uso? Por que é um problema que o processo congele por um curto período de tempo?
l0b0

Respostas:

4

Tecnicamente, foojá é executado em segundo plano. Você pode iniciar uma segunda sessão de terminal e a primeira continuará sendo executada fooenquanto você faz outras coisas.

No X, isso simplesmente envolve iniciar um segundo aplicativo de terminal ou abrir outra guia se o emulador de terminal de sua escolha tiver esses recursos.

No console, se você não planejou, seria necessário mudar para um terminal virtual diferente e efetuar login novamente.

Se você usa um multiplexador de terminal como esse screenou tmuxpode iniciar outra sessão nele. Por exemplo, na tela, isso é feito usando Ctrl+ Aimediatamente seguido por Ctrl+ C. Para alternar entre eles, use Ca Cn e Ca Cp para ir e voltar entre as sessões do terminal.

um CVn
fonte
Ou seja, não é possível no bash.
user877329
1
Essa resposta parece basear-se em um mal-entendido do conceito de trabalho em segundo plano. Um terminal possui um atributo "grupo de processos em primeiro plano", geralmente definido pelo shell, o que torna os processos nesse grupo capazes de ler a partir do terminal e receber sinais relacionados a tty como SIGINT. Todos os processos em execução no terminal que não estão no grupo de processos em primeiro plano são processos em segundo plano. Quando você cria um novo terminal, o trabalho em primeiro plano do terminal original ainda é o trabalho em primeiro plano nesse terminal, mesmo se você não estiver olhando para ele.
@ WumpusQ.Wumbley O ponto da minha resposta é que a maioria (todos?) Dos sistemas que podem executar o bash são multitarefas por sua própria natureza. Nesse sistema, mesmo que um processo tenha, digamos, foco de entrada, não há nada inerentemente "em primeiro plano" no processo em si; foo em si (verificação específica ausente, que eu acho que na natureza está entre rara e inexistente) não se importa se está sendo executada na janela superior ou mesmo se há algo exibindo sua saída.
um CVn
1
O que quero dizer é que, quando a pergunta menciona especificamente as palavras "background" e "job" - que são termos técnicos com significados definidos pela estrutura do grupo de processos POSIX -, bem como os mecanismos de Ctrl-Z e bg, ambos opere em grupos de processos - e sua resposta sugere não usar a funcionalidade do grupo de processos e você use a palavra "plano de fundo" de uma maneira que não corresponda à sua definição real - você não está ajustando sua resposta à pergunta. E para começar com "Tecnicamente foojá é executado em segundo plano" ... apenas ... Não. Tecnicamente.
@ WumpusQ.Wumbley De alguma forma, não acho que o OP leu o padrão POSIX e pensei "hmm, eu gostaria de usar isso, mas eu já comecei fooagora, o que devo fazer?". Se você acha que essa resposta (ou outras respostas) não é útil para responder à pergunta, incentivamos você a exercer seus privilégios de voto , além de deixar uma resposta própria respondendo à pergunta pelo que você acha que é o ângulo correto, em vez de discutindo sobre uma das respostas deixadas na pergunta. Talvez você sinta que, por exemplo, a resposta de l0b0 é melhor, mas minha resposta oferece uma maneira de fazer pelo menos aproximadamente o que o OP deseja.
um CVn
3

Adicionar um &sinal após o comando ( foo &) colocará em segundo plano imediatamente. Mas acredito que não há como, em uma configuração padrão de terminal / shell, colocar em segundo plano algo imediatamente, uma vez que esteja em primeiro plano.

l0b0
fonte
3

O envio de um aplicativo do primeiro plano para o segundo plano requer cooperação do terminal e do shell. O terminal não pode fazer isso sozinho, porque o shell precisa definir o grupo de processos em primeiro plano. O shell não pode fazer isso sozinho, porque o terminal precisa processar o pressionamento de tecla (o shell não está em primeiro plano, portanto, não pode receber um pressionamento de tecla).

Eu tenho uma configuração zsh onde posso pressionar Ctrl+ Zduas vezes em rápida sucessão; a primeira impressora suspende o processo e a segunda impressora o reinicia em segundo plano. Não sei como portá-lo para o bash.

Se você estiver executando em um emulador de terminal que permita inserir teclas, você pode injetar ^Zbg^M(usando a ^notação para caracteres de controle). Por exemplo, com um emulador de terminal X11, execute xdotool --window 1234 Ctrl_L+Z b g Returnonde 1234 é o ID da janela do emulador de terminal. Com Tela, execute screen -S foo -p 12 -X stuff $'\032bg\r'onde fooé o nome da sessão de tela e 12é o ID da janela.

Gilles 'SO- parar de ser mau'
fonte
2

Se sua digitação não for rápida o suficiente para o caso, execute a kill -s SIGSTOP 1023 && kill -s SIGCONT 1023partir de outro shell, supondo 1023 como PID de destino.

AVISO LEGAL: Como Ruslan provavelmente sabia, essa sequência realmente reinicia o trabalho tão rapidamente bashque nem percebe.

41754
fonte
Como isso colocaria o trabalho em segundo plano?
Ruslan
Quão rápido é rápido?
user877329