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.
^Znon fa lavori in background, li ferma. Un successivo bgesegue 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 synco 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 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 lavoronpuò 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 uncelavoro 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 stringacenella 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ì
%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.
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.
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 pythono killall java, pur avendo qualcosa di utile in esecuzione altrove nel sistema.