Como encerrar um processo em segundo plano?

196

Eu iniciei um wget na máquina remota em segundo plano usando &. De repente, ele para de baixar. Quero encerrar o processo e executar novamente o comando. Como posso encerrá-lo?

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

Mohammad Etemaddar
fonte

Respostas:

256

Existem muitas maneiras de fazer isso.

Método # 1 - ps

Você pode usar o pscomando para encontrar o ID do processo e, em seguida, usar o PID para interromper 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 você tem certeza de que é o único wgetque você executou, pode usar o comando pkillpara eliminar o trabalho pelo nome.

Exemplo

$ pkill wget

Método # 4 - trabalhos

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

Exemplo

Meu trabalho falso sleep.

$ sleep 100 &
[1] 4542

Encontre o número do 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 ao primeiro plano usando o fgcomando

Exemplo

Trabalho falso sleep,.

$ sleep 100 &
[1] 4650

Obter o número do trabalho.

$ jobs
[1]+  Running                 sleep 100 &

Traga o trabalho nº 1 de volta ao primeiro plano e use Ctrl+ C.

$ fg 1
sleep 100
^C
$
slm
fonte
O jobsnão tem outpute fg sais: -bash: fg: 1: no such job. Mas digitar fgfunciona bem e também pkill wgetfunciona bem. mas ps -eaf|grep wgetentão a kill <process number>dose não interrompe o trabalho. ps: eu uso o terceiro número como número do processo .
Mohammad Etemaddar 12/12
1
@MohammadEtemaddar - use o segundo número da saída de ps. O terceiro número é a identificação do processo dos pais.
slm
1
@MohammadEtemaddar - ah, o ps está encontrando o grep. Fazê-lo como este: ps -eaef| grep [w]get.
slm
1
@MohammadEtemaddar - você também pode usar pgrepem vez disso, pgrep wget.
slm
2
@MohammadEtemaddar - desculpe o e extra é um erro de digitação. Deve ler ps -eaf | grep [w]get. As opções estão na pspágina do manual. man ps.
slm
70

No bash, você pode usar fgpara colocar o trabalho em primeiro plano e usar Ctrl+C

Ou liste o processo em segundo plano com jobse, em seguida, faça

kill %1

(com 1 substituído pelo número jobsfornecido)

Zelda
fonte
13

Você também pode usar kill $!para eliminar o trabalho em segundo plano mais recente.

tek0078
fonte
Se for usado como um comando como um alias em um perfil do bash, certifique-se de incluir aspas simples.
Nate Ritter
6

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

basta digitar fgpara trazê-lo para o primeiro plano, se foi o último processo que você colocou em segundo plano (com '&').

Se não foi o último, digite: jobse encontre o 'número do trabalho', representado em '[]'. Então digite:

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.
queijo suíço
fonte
4

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

Tente isto

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

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

Se você executar trabalhos logo após matá-lo, deverá ver isso

Desktop$ jobs
[1]+  Terminated              sleep 1000
tmac
fonte
4

Uma coisa que não vejo aqui, que achei muito útil, especialmente ao testar comandos, é pidof. Você pode usar pidof [command]para encontrar a identificação do processo em execução no momento. Gosto porque permite encontrar rapidamente o ID do comando que desejo, que geralmente é algo que acabei de invocar.

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

Try431
fonte
1
Ah isso me ajudou! kill% 1 não estava funcionando por algum motivo, "kill: falha ao analisar o argumento: '% 1'" "e Ctrl + C não estava funcionando; não poderia encontrar processo no ps ou qualquer coisa porque era root (eu esqueci que eu usei sudo com ele)
mjohnsonengr
1

Um exemplo comum é a stressferramenta. Digamos que você executou o seguinte:

$ stress -c 4 -m 4 

e fechou a janela do terminal. O processo continuaria consumindo seus recursos em segundo plano.

Dela é o que eu faço:

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

pgreplista os PIDs do processo submetido e os armazena na variável xque então é usada kill -9para finalizá-lo.

Saptarshi Ghosh
fonte
0

No último processo interrompido do bash (Ctrl-Z), você mata:

kill %%
kill -9 %%

ou se desejar escolher, use:

jobs

então:

kill %N

gostar kill %2

Sławomir Lenart
fonte