Isso deve ser verdade para qualquer shell com controle de trabalho, que (na maior parte) você pode dar por garantido, a menos que lide com um shell verdadeiramente antigo. Está no padrão POSIX , então dash
suporta até o controle de tarefas (quando executado de forma interativa ou com -m
).
Interativo
- Ctrl+ zsuspenderá o programa atualmente em primeiro plano
bg
fará o plano de fundo do programa suspenso mais recente
(use bg %2
com o número do trabalho, que você pode verificar jobs
)
fg
colocará em primeiro plano o programa suspenso mais recentemente
Em zsh
, você pode escrever uma ligação de chave para executar implicitamente a fg
partir do prompt através de outro Ctrl+ z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Provavelmente, há também uma maneira inteligente de implicitamente executar bg
a suspensão, mas parece imprudente; pelo menos para mim, a maioria do meu Ctrl+ zuso é porque o Ctrl+ cestá falhando; Quero seguir isso com, por exemplo, kill %1
e não bg
, e certamente não quero deixar de matar! (Essa lógica também se estende ao motivo pelo qual eu não uso mais essa ligação de teclas: se eu estiver pressionando o Ctrl+ zpara interromper um processo, a última coisa que eu quero fazer é continuar!)
Não interativo
Se você estiver em uma instância de shell diferente (ou um usuário diferente, às vezes incluindo sudo
comandos), provavelmente não poderá usar os números de trabalho.
Você ainda pode atuar em outro processo depois de conhecer seu ID do processo (PID). Você pode obter o PID com pgrep …
, ou ps aux |grep …
(ou do mesmo shell jobs -l
, ou $!
) e, em seguida, executar:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Se você não souber o ID do processo e não estiver preocupado em suspender outras instâncias do processo pelo nome, poderá passar sinais para um destes:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Um CONT
sinal para um programa parado com Ctrl+ z(e não bg
'd) continuará seu progresso (em primeiro plano), o mesmo que se você estivesse fg
nele.
Re: Erro padrão
A edição desta pergunta pergunta sobre o erro padrão:
O processo é enviado para stderr, então como devo emitir o comando fg <jobid>
enquanto o processo está sendo enviado para o terminal?
A menos que o trabalho em questão tenha componentes em segundo plano (ou todo o trabalho seja em segundo plano, talvez via kill -CONT
), você não deverá ver a saída enquanto estiver suspensa.
Se ainda estiver emitindo dados (seja na saída padrão ou erro padrão), certamente o seu terminal ficará confuso visualmente, mas toda essa saída será ignorada, pois não faz parte da sua entrada. Isso pode tornar mais difícil saber que você não digitou nenhum erro de digitação, mas (cegamente) a digitação fg
Enterdeve ser suficiente (a menos que você tenha vários trabalhos e o item em questão não seja o mais recente, nesse caso, você realmente precisará do descritor de trabalho )
Se você precisar encontrar o descritor de tarefas, use outro terminal para enviar o STOP
sinal através dos métodos não interativos acima. Isso deve liberar sua exibição (talvez pressione Enteralgumas vezes ou execute clear
ou Ctrl+ L) para que você possa executar jobs
para encontrar o descritor de tarefa e depois executar fg %N
onde N
está esse número.