Come posso uccidere l'ultima attività in background generata in Linux?
Esempio:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Come posso uccidere l'ultima attività in background generata in Linux?
Esempio:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Risposte:
C'è una variabile speciale per questo in bash:
kill $!
$! si espande al PID dell'ultimo processo eseguito in background.
^Z
non fa lavori in background, li ferma. Un successivo bg
esegue il 'backgrounding' effettivo (riprende l'esecuzione in background) e successivamente $!
funziona come previsto.
????
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 sync
o anche un sleep <n>
) proprio prima del primo di tali comandi "dipendenti".
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 jobs
comando. 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 lavoron
può 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%ce
riferisce a unce
lavoro 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 stringace
nella 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.
set -m
), è destinato all'uso interattivo. Vedere stackoverflow.com/questions/690266/... così
%1
e %%
- 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 ps
o forse jobs -l
, e poi digitare nuovamente il PID, che è noioso.
while true
con 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.
Questo dovrebbe uccidere tutti i processi in background:
jobs -p | xargs kill -9
kill -9 %%
è meno digitante :)
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.
Usa il comando killall:
killall taskname
per maggiori informazioni e opzioni più avanzate, digita "man killall".
killall python
o killall java
, pur avendo qualcosa di utile in esecuzione altrove nel sistema.