Como suspender e trazer um processo em segundo plano para o primeiro plano

148

Eu tenho um processo originalmente em execução em primeiro plano. Suspenso por Ctrl + Z e, em seguida, retome sua execução em segundo plano por bg <jobid> .

Gostaria de saber como suspender um processo em segundo plano?

Como posso trazer um processo em segundo plano para o primeiro plano?

Editar:

O processo é enviado para stderr, então como devo emitir o comando fg <jobid> enquanto o processo está saindo para o terminal?

    
por Tim 08.08.2012 / 14:45

5 respostas

189

Como Tim disse, digite fg para trazer o último processo de volta ao primeiro plano.

Se você tiver mais de um processo em execução em segundo plano, faça o seguinte:

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3 para trazer o processo vim 23 de volta ao primeiro plano.

Para suspender o processo em execução em segundo plano, use:

kill -STOP %job_id

O sinal SIGSTOP para (pausa) um processo essencialmente da mesma maneira Ctrl + Z .

exemplo: kill -STOP %3 .

fontes: Como enviar sinais para processos no Linux e no Unix e Como gerenciar os trabalhos em segundo plano e em primeiro plano .

    
por 08.08.2012 / 14:58
27

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.

    
por 16.01.2015 / 01:15
9

Digite fg para trazê-lo para o primeiro plano.

    
por 08.08.2012 / 14:47
0

O término de um processo pode ser feito de várias maneiras diferentes. Geralmente, a partir de um comando baseado em console, o envio de um pressionamento de tecla Ctrl c (o caractere de interrupção padrão) sairá do comando. Isso funciona quando o processo está sendo executado no modo de primeiro plano.

Se um processo estiver sendo executado em modo de segundo plano, primeiro você precisará obter seu ID de trabalho usando o comando ps e, depois, usar o comando kill para eliminar o processo da seguinte forma:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Aqui, o comando kill terminaria o processo first_one . Se um processo ignorar um comando normal kill , você poderá usar kill -9 seguido pelo ID do processo da seguinte forma:

$kill -9 6738
Terminated
    
por 31.10.2014 / 09:36
0
  1. listar trabalhos com o comando jobs
  2. Traga seu trabalho de destino para o primeiro plano com fg ; por exemplo: fg %4
  3. Pressione CTRL Z para suspender
  4. Para começar a ser executado em segundo plano, use bg; por exemplo: bg %4
por 16.11.2018 / 17:57