Como você envia aplicativos de linha de comando diretamente para o plano de fundo?

22

Eu já sei que pressionar para ctrl+zinterromper o aplicativo, então posso enviá-lo para segundo plano com o bgcomando, mas isso significa que há um breve período de tempo em que o aplicativo é parado.

Como envio o aplicativo diretamente para o plano de fundo sem pará-lo?

trusktr
fonte
Certamente você não pode, se já estiver em execução.
31713 Kevin
1
Se sua tarefa requer sua entrada "antes de desaparecer" em segundo plano, você pode usar ferramentas como zenity ou yad (se você gosta de guis). Eles ainda podem enviar e receber saída em segundo plano. Tenho certeza de que brincar com pipes e dispositivos também permitiria o acesso ao console em segundo plano, mas não tenho certeza de como fazê-lo.
5133 Joe
@ Joe Isso é legal, mas não é o que quero dizer. Eu só quero enviar um aplicativo diretamente para o plano de fundo sem pausá-lo. ou seja, sem pressionar ctrl+zseguido de executar o comando bg. Existe uma combinação única de teclas para enviar o aplicativo para segundo plano?
trusktr

Respostas:

17

O envio de um aplicativo de 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).

Uma aproximação aproximada é enviar o aplicativo para o plano de fundo muito rápido. Afinal, um aplicativo compartilha o tempo da CPU com outros e uma pausa de alguns centésimos de segundo não deve importar. (Aplica-se a aplicativos em tempo real, portanto, inicie-os em segundo plano.) Uso uma ligação de shell para Ctrl+ Zque envia o último trabalho em primeiro plano para o segundo plano. Dessa forma, pressionar Ctrl+ Z Ctrl+ Zenvia um trabalho para o segundo plano com um tempo mínimo de suspensão.

Aqui está minha ligação do zsh, que também coloca em segundo plano” um comando meio digitado quando a linha de comando não está vazia .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

Em inglês, para os não usuários do zsh na platéia:

  • Defina uma função de shell que faça o seguinte:

  • Vincule esta função a Ctrl+ Z.

Se você deseja apenas o comportamento de segundo plano, independentemente de a linha de comando estar vazia:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Não sei se você pode fazer o mesmo no bash. Deve ser tão fácil quanto bind -x '"\C-z": bg', exceto que o bash deixa o caractere de parada tty no lugar, para nunca receber Ctrl+ Zcomo entrada.

Gilles 'SO- parar de ser mau'
fonte
Interessante, deixe-me ver se isso pode ser feito no Bash. Nesse caso, isso seria uma solução. Eu não estou familiarizado com o zsh. Importa-se de explicar o que o seu script faz?
trusktr
@trusktr Veja minha edição.
Gilles 'SO- stop be evil'
Obrigado! Estou prestes a mudar para o zsh. Eu tenho ouvido muitas coisas boas sobre isso.
trusktr
15

Você pode colocar em segundo plano uma tarefa adicionando um &depois dela.

Por exemplo tail -f /var/log/messages &, a tarefa será executada em segundo plano imediatamente.

Como sempre, você pode ver quais tarefas foram executadas em segundo plano com o jobscomando.

Obviamente, isso pressupõe que você ainda não executou o comando.

prateek61
fonte
Isso é útil, mas não é o que quero dizer. Se eu tiver o aplicativo em primeiro plano e quiser enviá-lo para segundo plano mais tarde, pressione ctrl+ze execute bgna linha de comando para que o aplicativo seja executado em segundo plano. Mas entre pressionar ctrl+ze executar bg, há um prazo para que o aplicativo esteja completamente em pausa. Eu não quero isso Como envio imediatamente para segundo plano ?
trusktr
@trusktr como Gilles disse. Você precisa informar o shell e o terminal. Desculpe, não sei como fazer isso.
precisa saber é o seguinte
Não responde à pergunta.
Luciano Andress Martini
4

O segundo plano de um comando é feito anexando um e comercial ao comando.

sleep 300 &

Se já estiver em execução, sua única opção é pará-lo e, em segundo plano.

bahamat
fonte
Entre pressionar ctrl + z e executar bg, há um período em que o aplicativo está completamente pausado, e é isso que eu não quero. Portanto, não há como enviá-lo para segundo plano imediatamente ?
trusktr
1
Não. Como Giles disse, é preciso tanto o shell quanto o terminal. Você precisa informar cada um.
bahamat