Linux: kill task in background


195

Come posso uccidere l'ultima attività in background generata in Linux?

Esempio:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
Come può non essere collegato alla programmazione? La programmazione Bash non sta programmando?
flybywire,

6
Questo è nella regione di sovrapposizione tra SO e SU, ma penso che si adatti meglio qui su SO. Il mio criterio per pensare in questo modo è che se @flybywire lo sta facendo in uno script, è programmazione. Se volesse solo farlo dalla riga di comando, direi che appartiene a SU.
Bill the Lizard,

10
Anche lo scripting della shell sta programmando.
cletus,

Risposte:


234

C'è una variabile speciale per questo in bash:

kill $!

$! si espande al PID dell'ultimo processo eseguito in background.


68
@ polm23; no, ^Znon fa lavori in background, li ferma. Un successivo bgesegue il 'backgrounding' effettivo (riprende l'esecuzione in background) e successivamente $!funziona come previsto.
falstro,

Supponendo ????che uno o più comandi debbano essere eseguiti dopo l'uccisione, se uno di questi comandi si basa sul lavoro svolto dal processo in background, prestare attenzione a qualsiasi operazione di pulizia o rifinitura che il processo in background potrebbe eseguire in un gestore dei segnali dopo ricevere un segnale (intercettabile). È meglio aggiungere un wait(seguito forse da un synco anche un sleep <n>) proprio prima del primo di tali comandi "dipendenti".
ack

2
Per il completamento: poiché una singola% si riferisce anche al lavoro corrente, è possibile terminare il lavoro interrotto (^ z) con "kill%". Lo uso quasi sempre dopo ^ z.
3

Funziona solo se hai abilitato il controllo dei lavori, che è attivo solo per impostazione predefinita nelle shell interattive (anche se dal momento che ti riferisci all'uso di ctrl-z immagino che ti riferisci anche all'uso di una shell interattiva) - ma questo è stato delineato in altre risposte qui, non sono sicuro del perché questo sia "per completezza" :)
falstro

289

Puoi uccidere per numero di lavoro. Quando metti un'attività in background vedrai qualcosa di simile:

$ ./script &
[1] 35341

Questo [1]è il numero del lavoro e può essere referenziato come:

$ kill %1
$ kill %%  # Most recent background job

Per vedere un elenco di numeri di lavoro utilizzare il jobscomando. Altro da man bash:

Esistono diversi modi per fare riferimento a un lavoro nella shell. Il personaggio %introduce un nome di lavoro. Il numero di lavoro npuò essere indicato come %n. È inoltre possibile fare riferimento a un lavoro usando un prefisso del nome usato per avviarlo o usando una sottostringa che appare nella sua riga di comando. Ad esempio, si %ceriferisce a un celavoro interrotto . Se un prefisso corrisponde a più di un lavoro, bash segnala un errore. L'uso %?ce, d'altra parte, si riferisce a qualsiasi lavoro contenente la stringa cenella sua riga di comando. Se la sottostringa corrisponde a più di un lavoro, bash segnala un errore. I simboli %%e%+fare riferimento alla nozione della shell del lavoro corrente, che è l'ultimo lavoro interrotto mentre era in primo piano o avviato in background. È possibile fare riferimento al lavoro precedente utilizzando %-. Nell'output relativo ai lavori (ad esempio, l'output del comando jobs), il lavoro corrente viene sempre contrassegnato con a +e il lavoro precedente con a -. Un singolo %(senza specifiche del lavoro di accompagnamento) si riferisce anche al lavoro corrente.


Per la cronaca, penso che questo funzioni solo se il controllo del lavoro è abilitato. Anche se penso che tu possa attivarlo negli script ( set -m), è destinato all'uso interattivo. Vedere stackoverflow.com/questions/690266/... così
falstro

9
Simboli molto utili, questi %1e %%- soprattutto. Alcune cose non muoiono su Ctrl-C, quindi è necessario Ctrl-Z e quindi kill -9 %%. Un esempio in cui l'ho trovato utile è: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C ti porterà alla prossima iterazione del ciclo. Prima dovevo fare pso forse jobs -l, e poi digitare nuovamente il PID, che è noioso.
Tomasz Gandor,

Ce n'è uno per tutti i lavori?
CMCDragonkai,

3
@TomaszGandor Ecco perché si potrebbe desiderare di sostituire while truecon while sleep 1. Questo ti darà un breve ritardo prima di riavviare se riesci a convivere con quello, e se premi due volte ctrl-c, il secondo interromperà il sonno, terminandolo con un'uscita diversa da zero e uscendo dal loop.
falstro,

45

Il seguente comando fornisce un elenco di tutti i processi in background nella sessione, insieme al pid. È quindi possibile utilizzarlo per terminare il processo.

jobs -l

Esempio di utilizzo:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

Questo dovrebbe uccidere tutti i processi in background:

jobs -p | xargs kill -9

1
Questo è quello che userei prima, ma kill -9 %%è meno digitante :)
Tomasz Gandor

4
@TomaszGandor Questo ucciderà solo il lavoro corrente, ovvero l'ultimo lavoro interrotto in primo piano o avviato in background. Il comando nella risposta ucciderà TUTTI i lavori.
Bitek,


2
skill doB

skill è una versione del comando kill che consente di selezionare uno o più processi in base a un determinato criterio.


0

Hai bisogno del suo pid ... usa "ps -A" per trovarlo.


0

questa è una risposta fuori tema, ma, per coloro che sono interessati, può essere utile.

Come nella risposta di @John Kugelman,% è correlato alle specifiche del lavoro. come trovarlo efficacemente? usa less's & pattern command , sembra che man use less pager (non è sicuro), in man bash digita &% quindi digita Enter mostrerà solo le righe che contengono '%', per mostrare tutto, digita &. quindi Invio.


-3

Usa il comando killall:

killall taskname

per maggiori informazioni e opzioni più avanzate, digita "man killall".


4
Penso che killall sia un po 'aggressivo quando in realtà hai un facile accesso al PID. E anche pericoloso, specialmente se sei root
Dave Vogt,

3
Non molto utile, se fosse necessario killall pythono killall java, pur avendo qualcosa di utile in esecuzione altrove nel sistema.
Tomasz Gandor,
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.