Isso deve ser verdade para qualquer shell com controle de job, que (na maioria das vezes) você pode considerar como certo, a menos que lide com uma shell realmente antiga. Está no padrão POSIX , portanto, mesmo dash
suporta controle de tarefas (quando executado de forma interativa ou com -m
).
Interativo
-
Ctrl + z suspenderá o programa em primeiro plano
-
bg
será o plano de fundo do programa suspenso mais recentemente
(use bg %2
com o número do trabalho, que você pode verificar com jobs
)
-
fg
colocará em primeiro plano o programa suspenso mais recentemente
Em zsh
, você pode escrever uma ligação de chave para executar implicitamente fg
a partir do prompt por meio de outra Ctrl + z :
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Provavelmente, também há uma maneira inteligente de executar bg
implicitamente ao suspender, mas parece insensato; pelo menos para mim, a maioria do meu uso de Ctrl + z é porque Ctrl + c está falhando ao quebrar Fora; Quero seguir isso com, por exemplo, kill %1
em vez de bg
, e eu certamente não quero padrão para matar! (Essa lógica também se estende por que eu não uso mais essa ligação de chave: Se eu estiver pressionando Ctrl + z para parar um processo, a última coisa que eu quero é é retomar!)
Não interativo
Se você estiver em uma instância de shell diferente (ou um usuário diferente, às vezes incluindo comandos sudo
), provavelmente não conseguirá usar números de trabalho.
Você ainda pode atuar em outro processo depois de conhecer seu ID de processo (PID). Você pode obter o PID com pgrep …
ou ps aux |grep …
(ou do mesmo shell, jobs -l
ou $!
) e você poderá 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á transmitir os sinais para um destes:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Um sinal CONT
para um programa parado com Ctrl + z (e não bg
'd) irá retomar seu progresso (em primeiro plano), o sinal como se você fosse para fg
it.
Re: erro padrão
A edição desta pergunta é sobre o erro padrão:
The process outputs to stderr, so how shall I issue the command fg <jobid>
while the process is outputting to the terminal?
A menos que o trabalho em questão possua componentes com experiência (ou todo o trabalho seja baseado em plano de fundo, talvez por meio de kill -CONT
), você não deverá ver a saída enquanto ela estiver suspensa.
Se ainda estiver enviando dados (seja para saída padrão ou erro padrão), isso certamente tornará seu terminal visualmente confuso, mas toda essa saída será ignorada, pois não faz parte de sua entrada. Isso pode tornar mais difícil saber se você não digitou nenhum erro de digitação, mas (cegamente) digitar fg
Enter deve ser suficiente (a menos que você tenha vários trabalhos e o em questão não seja o mais recente , caso em que você realmente precisa do descritor de trabalho).
Se você precisar encontrar o descritor de trabalho, use outro terminal para enviar o sinal STOP
pelos métodos não interativos acima. Isso deve liberar sua tela (talvez pressione Enter algumas vezes ou execute clear
ou Ctrl + L ) para que você possa executar jobs
para encontrar o descritor de trabalho e, em seguida, executar fg %N
, em que N
é esse número.