Come terminare un processo in background?


196

Ho avviato un wget su una macchina remota in background utilizzando &. Improvvisamente si interrompe il download. Voglio terminare il suo processo, quindi rieseguire il comando. Come posso terminarlo?

Non ho chiuso la finestra della shell. Ma come sai non smette di usare Ctrl+ Ce Ctrl+ Z.

Risposte:


256

Ci sono molti modi per farlo.

Metodo n. 1 - ps

È possibile utilizzare il pscomando per trovare l'ID processo per questo processo e quindi utilizzare il PID per terminare il processo.

Esempio

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

$ kill 1713

Metodo n. 2 - pgrep

È inoltre possibile trovare l'ID processo utilizzando pgrep.

Esempio

$ pgrep wget
1234

$ kill 1234

Metodo n. 3 - pkill

Se sei sicuro che sia l'unico wgetche hai eseguito, puoi usare il comando pkillper terminare il lavoro per nome.

Esempio

$ pkill wget

Metodo n. 4: lavori

Se ti trovi nella stessa shell da cui hai eseguito il lavoro che ora è in background. Puoi controllare se è ancora in esecuzione usando il jobscomando e anche ucciderlo per il suo numero di lavoro.

Esempio

Il mio lavoro falso, sleep.

$ sleep 100 &
[1] 4542

Trova il numero del lavoro. NOTA: il numero 4542 è l'ID del processo.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Metodo # 5 - fg

È possibile riportare in primo piano un lavoro in background utilizzando il fgcomando.

Esempio

Falso lavoro, sleep.

$ sleep 100 &
[1] 4650

Ottieni il numero del lavoro.

$ jobs
[1]+  Running                 sleep 100 &

Riporta il lavoro n. 1 in primo piano, quindi usa Ctrl+ C.

$ fg 1
sleep 100
^C
$

Il jobsnon ha outpute fg sais: -bash: fg: 1: no such job. Ma la digitazione fgfunziona bene e pkill wgetfunziona anche bene. ma ps -eaf|grep wgete poi la kill <process number>dose non interrompe il lavoro. ps: uso il terzo numero come numero di processo .
Mohammad Etemaddar,

1
@MohammadEtemaddar - usa il 2o numero dall'output di ps. Il terzo # è l'id del processo del genitore.
slm

1
@MohammadEtemaddar - ah, il ps sta trovando il grep. Fare in questo modo: ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - è anche possibile utilizzare pgrepinvece, pgrep wget.
slm

2
@MohammadEtemaddar - scusa l'extra è un errore di battitura. Dovrebbe leggere ps -eaf | grep [w]get. Le opzioni sono nella pspagina man. man ps.
slm

70

In bash puoi usare fgper portare il lavoro in primo piano e quindi usare Ctrl+C

Oppure elenca il processo in background con jobse quindi esegui

kill %1

(con 1 sostituito dal numero jobsassegnato)


13

È inoltre possibile utilizzare kill $!per terminare il processo in background più recente.


Se viene utilizzato come comando come un alias in un profilo bash, assicurati di racchiudere tra virgolette singole.
Nate Ritter,

6

EDIT: una volta in primo piano, puoi Ctrl+ C, o come menziona @Zelda, uccidere con '% x' dove 'x' è il numero del lavoro invierà il segnale predefinito (molto probabilmente SIGTERM nel caso di Linux).

basta digitare fgper portarlo in primo piano, se è stato l'ultimo processo in background (con '&').

Se non era l'ultimo, digitare: jobse trovare il "numero lavoro", rappresentato in "[]". Quindi digita:

fg 2

.. dove '2' è il numero del lavoro, ad esempio:

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.

4

Il modo corretto è digitare jobsquindi utilizzare il numero lavoro per ucciderlo. Per usare il pid per ucciderlo devi portarlo in primo piano come indicato nella prima risposta.

Prova questo

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

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

Se esegui lavori subito dopo averlo ucciso, dovresti vedere questo

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Una cosa che non vedo qui, che ho trovato molto utile soprattutto durante il test dei comandi, è pidof. È possibile utilizzare pidof [command]per trovare l'ID processo di un processo attualmente in esecuzione. Mi piace perché mi permette di trovare rapidamente l'id del comando che desidero, che di solito è qualcosa che ho appena invocato.

Una volta ottenuto il pid, puoi semplicemente terminare il processo. Permette di creare semplici script per uccidere un processo solo se è attualmente in esecuzione.


1
Ah questo mi ha aiutato! kill% 1 non funzionava per qualche motivo, "kill: impossibile analizzare l'argomento: '% 1'" e Ctrl + C non funzionava; impossibile trovare il processo in ps o altro perché era root (ho dimenticato di aver usato sudo con esso)
mjohnsonengr

1

Un esempio comune è lo stressstrumento. Supponiamo che tu abbia eseguito quanto segue:

$ stress -c 4 -m 4 

e chiuse la finestra del terminale. Il processo continuerebbe a consumare le tue risorse dallo sfondo.

È quello che faccio:

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

pgrepelenca i PID del processo sottoposto e li memorizza in una variabile xche poi ha usato kill -9per terminarlo.


0

nell'ultimo processo interrotto (Ctrl-Z) ucciderai per:

kill %%
kill -9 %%

o se vuoi scegliere, usa:

jobs

poi:

kill %N

piace kill %2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.