Como encerrar um processo em segundo plano?

168

Eu iniciei um wget na máquina remota em background usando & . De repente, ele pára de baixar. Eu quero terminar seu processo e, em seguida, execute novamente o comando. Como posso terminar isso?

Eu não fechei a janela do shell. Mas como você sabe, não para de usar Ctrl + C e Ctrl + Z .

    
por Mohammad Etemaddar 12.12.2013 / 08:11

7 respostas

228

Existem muitas maneiras de fazer isso.

Método 1 - ps

Você pode usar o comando ps para encontrar o ID do processo para esse processo e, em seguida, usar o PID para eliminar o processo.

Exemplo

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Método # 2 - pgrep

Você também pode encontrar o ID do processo usando pgrep .

Exemplo

$ pgrep wget
1234

$ kill 1234

Método # 3 - pkill

Se tiver certeza de que é o único wget que você executou, use o comando pkill para eliminar o trabalho pelo nome.

Exemplo

$ pkill wget

Método 4 - empregos

Se você estiver no mesmo shell de onde você executou o trabalho que agora está em segundo plano. Você pode verificar se ele ainda está em execução usando o comando jobs e também matá-lo pelo número do trabalho.

Exemplo

Meu trabalho falso, sleep .

$ sleep 100 &
[1] 4542

Encontre o seu número de trabalho. NOTA: o número 4542 é o ID do processo.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Método 5 - fg

Você pode trazer um trabalho em segundo plano de volta para o primeiro plano usando o comando fg .

Exemplo

Emprego falso, sleep .

$ sleep 100 &
[1] 4650

Obtenha o número do trabalho.

$ jobs
[1]+  Running                 sleep 100 &

Traga o job # 1 de volta ao primeiro plano e, em seguida, use Ctrl + C .

$ fg 1
sleep 100
^C
$
    
por 12.12.2013 / 08:21
59

No bash você pode usar fg para colocar o trabalho no primeiro plano e depois usar Ctrl + C

Ou liste o processo em segundo plano com jobs e faça

kill %1

(com 1 substituído pelo número jobs deu a você)

    
por 12.12.2013 / 08:17
7

Você pode usar igualmente kill $! para matar o trabalho com histórico mais recente.

    
por 25.01.2017 / 16:39
5

EDIT: Uma vez no primeiro plano, você pode Ctrl + C , ou como @Zelda menciona, matar com o '% x' onde 'x' é o trabalho número irá enviar o sinal padrão (mais provável SIGTERM no caso do Linux).

Basta digitar fg para trazê-lo para o primeiro plano, se foi o último processo que você usou (com '&').

Se não foi o último, digite: jobs e encontre o 'job number', representado em '[]'. Então, basta digitar:

fg 2

.. onde '2' é o número do trabalho, por exemplo:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.
    
por 12.12.2013 / 08:20
4

A maneira correta é digitar jobs , em seguida, use o número do trabalho para eliminá-lo. Para usar o pid para matá-lo, você precisa trazê-lo para o primeiro plano, como observado na primeira resposta.

Tente isso

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Se você executar trabalhos logo depois de matá-lo, verá isso

Desktop$ jobs
[1]+  Terminated              sleep 1000
    
por 02.09.2014 / 20:06
4

Uma coisa que não vejo aqui, que eu achei muito útil, especialmente ao testar os comandos, é pidof . Você pode usar pidof [command] para encontrar o ID do processo de um processo em execução no momento. Eu gosto porque me permite encontrar rapidamente o id do comando que eu quero, que geralmente é algo que acabei de invocar.

Depois de ter o pid, você pode simplesmente matar o processo. Ele permite a criação de scripts simples para matar um processo apenas se estiver em execução no momento.

    
por 23.06.2016 / 06:08
1

Um exemplo comum é a ferramenta stress . Vamos dizer que você correu o seguinte:

$ stress -c 4 -m 4 

e fechou a janela do terminal. O processo continuaria comendo seus recursos do plano de fundo.

O que eu faço:

$ x='pgrep stress' ; sudo kill -9 $x 

pgrep lista os PIDs do processo submetido e os armazena na variável x que, então, usou kill -9 para finalizá-lo.

    
por 11.06.2018 / 04:18