GNU/Linux >> Linux Esercitazione >  >> Linux

Oltre 10 esempi per uccidere un processo in Linux

In questo tutorial parleremo dell'uccisione di un processo in Linux con più esempi. Nella maggior parte dei casi, basta digitare il comando "kill" seguito dall'ID del processo (comunemente abbreviato come PID).

Come puoi vedere, abbiamo terminato un processo con l'ID 1813.

Se sei un utente Windows, può essere utile pensare al comando "kill" come all'equivalente di Linux del pulsante "Termina attività" all'interno del task manager di Windows.

Elenca i processi in esecuzione

Il comando "ps -e" elencherà tutto ciò che è in esecuzione sul tuo sistema. Anche con un'installazione minima, il comando produrrà probabilmente più di 80 risultati, quindi è molto più semplice inviare il comando a "grep" o "altro".

ps -e | grep name-of-process

Nello screenshot qui sotto, controlliamo se SSH è in esecuzione sul sistema.

Questo ci fornisce anche il PID del demone SSH, che è 1963.

Passa a "altro" se vuoi esaminare uno per uno i processi in esecuzione del tuo sistema.

Puoi anche utilizzare il comando "top" per vedere un elenco di processi in esecuzione. Questo è utile perché ti mostrerà quante risorse di sistema sta utilizzando ciascun processo.

Il PID, l'utente e il nome della risorsa sono tutti identificati qui, il che è utile se decidi di interrompere uno di questi servizi in un secondo momento.

Presta attenzione alle colonne %CPU e %MEM, perché se noti un processo non importante che consuma preziose risorse di sistema, probabilmente è utile eliminarlo!

Un altro metodo molto efficiente per ottenere l'ID del processo corrispondente consiste nell'usare il comando "pgrep". L'unico argomento che devi fornire è il nome (o parte del nome) del processo in esecuzione.

Ecco come appare quando cerchiamo SSH. Come puoi vedere, restituisce un ID processo 2506.

Uccidi un processo tramite PID

Ora che conosciamo il PID del demone SSH, possiamo terminare il processo con il comando kill.

$ sudo kill 1963

Puoi emettere un comando "ps" finale, solo per assicurarti che il processo sia stato effettivamente terminato.

$ ps -e | grep ssh

I risultati risultano vuoti, il che significa che il processo è stato interrotto correttamente. Se noti che il processo continua a essere eseguito, cosa che normalmente non dovrebbe accadere, puoi provare a inviare un segnale di kill diverso al processo, come spiegato nella sessione successiva.

Nota:non è sempre necessario utilizzare "sudo" o l'account utente root per terminare un processo. Nel primo esempio, stavamo terminando il demone SSH, che viene eseguito sotto l'utente root. Pertanto, dobbiamo disporre delle autorizzazioni appropriate per terminare il processo.

Segnale predefinito inviato dal comando kill

Per impostazione predefinita, il comando kill invierà un segnale SIGTERM al processo da te specificato.

Ciò dovrebbe consentire al processo di terminare in modo regolare, poiché SIGTERM indicherà al processo di eseguire le normali procedure di arresto, in altre parole, non costringe il processo a terminare bruscamente.

Questa è una buona cosa perché vogliamo che i nostri processi si chiudano come previsto.

A volte, però, il segnale SIGTERM non è sufficiente per terminare un processo. Se esegui il comando kill e noti che il processo è ancora in esecuzione, è possibile che il processo sia ancora in fase di arresto o che si sia completamente bloccato.

Uccisioni forzate

Per forzare la chiusura del processo e rinunciare al suo normale arresto, puoi inviare un segnale SIGKILL con l'interruttore -9, come mostrato qui:

$ kill -9 processID

Può essere allettante aggiungere sempre l'opzione -9 sui tuoi comandi kill poiché funziona sempre. Tuttavia, questa non è la procedura consigliata. Dovresti usarlo solo su processi che sono stati bloccati e si rifiutano di spegnersi correttamente.

Quando possibile, utilizzare il segnale SIGTERM predefinito. Ciò eviterà errori a lungo termine, poiché dà al processo la possibilità di chiudere i suoi file di registro, terminare eventuali connessioni persistenti, ecc.

A parte i segnali SIGTERM e SIGKILL, c'è una sfilza di altri segnali che kill può inviare ai processi, tutti visibili con l'opzione -l.

I numeri accanto ai nomi sono quelli che specificheresti nel tuo comando "uccidi". Ad esempio, kill -9 è SIGKILL, proprio come vedi nello screenshot qui sopra.

Per le operazioni quotidiane, SIGTERM e SIGKILL sono probabilmente gli unici segnali che non dovrai mai utilizzare. Tieni solo a mente gli altri nel caso in cui si verificasse una strana circostanza in cui un processo consiglia di terminarlo con un segnale diverso.

Come uccidere tutti i processi per nome?

È inoltre possibile utilizzare il nome di un processo in esecuzione, anziché il PID, con il comando pkill. Ma attenzione, questo terminerà tutto i processi in esecuzione con il nome specificato, poiché kill non saprà quale processo specifico stai tentando di terminare.

$ pkill name-of-process

Dai un'occhiata all'esempio seguente, dove terminiamo cinque processi con un singolo comando pkill.

In questo esempio, volevamo terminare solo una di quelle sessioni dello schermo; sarebbe stato necessario specificare il PID e utilizzare il normale comando "kill". Altrimenti, non c'è modo di specificare in modo univoco il processo che desideriamo terminare.

Come uccidere tutti i processi di un utente?

Puoi anche usare il comando pkill per terminare tutti i processi in esecuzione da un utente Linux. Per prima cosa, per vedere quali processi sono in esecuzione sotto un utente specifico, usa il comando ps con un'opzione -u.

$ ps -u username

Quello screenshot ci mostra che ci sono attualmente cinque servizi in esecuzione sotto l'utente "geek". Se hai bisogno di terminarli tutti rapidamente, puoi farlo con pkill.

$ pkill -u username

Come eliminare un processo nohup?

Puoi terminare il processo nohup allo stesso modo di qualsiasi altro processo in esecuzione. Nota che non puoi grep per "nohup" nel comando ps, quindi dovrai cercare il processo in esecuzione usando gli stessi metodi mostrati sopra.

In questo esempio, troviamo uno script intitolato "test.sh" che è stato eseguito con il comando nohup. Come vedrai, trovarlo e terminarlo è più o meno lo stesso degli esempi precedenti.

L'unica differenza con l'output è che la shell ci informa che il processo è stato terminato. Non fa parte di kill, ma piuttosto il risultato dell'esecuzione dello script in background (la e commerciale in questo esempio) e della connessione alla stessa tty da cui è stato avviato lo script.

$ nohup ./test.sh &

Come eseguire un processo in background?

Il comando kill è un modo efficiente per terminare i processi in esecuzione in background. Hai già imparato come uccidere i processi in questo tutorial, ma sapere come eseguire un processo in background è una combinazione efficace da usare con il comando kill.

Puoi aggiungere una e commerciale (&) al tuo comando in modo che venga eseguito in background. Questo è utile per comandi o script che richiedono un po' di tempo per essere eseguiti e nel frattempo desideri svolgere altre attività.

Qui abbiamo messo in background un semplice comando 'ls'. Poiché è il tipo di comando che richiede pochissimo tempo per essere eseguito, riceviamo più output sul completamento del suo lavoro subito dopo.

L'output nel nostro screenshot dice "Fatto", il che significa che il lavoro in background è stato completato con successo. Se invece dovessi terminare il lavoro, mostrerebbe "terminato" nell'output.

Puoi anche spostare un lavoro in background premendo Ctrl+Z sulla tastiera. La ^Z in questa schermata indica che abbiamo premuto Ctrl+Z e lo script test.sh è passato in background.

Puoi vedere test.sh continuare a essere eseguito in background emettendo un comando ps.

$ ps -e | grep test.sh

Utilizzo del comando a schermo

Un altro modo per eseguire un processo in background è utilizzare il comando "schermo". Questo funziona creando ciò che sostanzialmente equivale a una finestra di terminale (o schermo e quindi il nome) separata.

Ogni schermata che crei ha il suo ID processo, il che significa che è un modo efficiente per creare processi in background che possono essere successivamente terminati utilizzando il comando kill.

Il comando Screen non viene fornito con tutte le installazioni Linux per impostazione predefinita, quindi potrebbe essere necessario installarlo.

Sulle distribuzioni basate su Ubuntu e Debian, puoi installarlo con il seguente comando:

$ sudo apt-get install screen

Una volta installato il comando schermo, puoi creare una nuova sessione semplicemente digitando "schermo".:

$ screen

Ma, prima di farlo, è bene prendere l'abitudine di specificare i nomi per i tuoi schermi. In questo modo, sono facili da cercare e identificare in seguito. Tutto ciò che serve per specificare un nome è l'opzione -S.

$ screen -S my-screen-name

Creiamo una schermata chiamata "testing" e poi proviamo a terminarla con il comando "kill". Iniziamo così:

Dopo aver digitato questo comando e premuto invio, veniamo immediatamente indirizzati alla nostra schermata appena creata. Qui è dove puoi avviare il processo che desideri avere in esecuzione in background.

Ciò è particolarmente utile se sei collegato tramite SSH a un server e hai bisogno di un processo per continuare a funzionare anche dopo la disconnessione.

Con il comando/script in esecuzione, puoi disconnetterti dallo schermo premendo Ctrl+A, seguito da D (rilascia i tasti Ctrl e A prima di premere il tasto D).

Come puoi vedere, il comando dello schermo ha elencato l'ID del processo non appena abbiamo staccato lo schermo. Ovviamente, possiamo terminare questa schermata (e il comando/script in esecuzione al suo interno), usando il comando kill.

Puoi facilmente cercare l'ID del processo delle tue sessioni dello schermo usando questo comando:

$ screen -ls

Se non avessimo nominato la nostra sessione dello schermo utilizzando l'opzione -S, verrebbe elencato solo l'ID del processo stesso. Per ricollegarti a una qualsiasi delle schermate elencate, puoi utilizzare l'opzione -r:

$ screen -r name-of-screen

o

$ screen -r PID

Nello screenshot qui sotto, stiamo uccidendo la sessione dello schermo che abbiamo creato (insieme a tutto ciò che viene eseguito al suo interno), quindi emettiamo un altro comando screen -ls per verificare che il processo sia effettivamente terminato.

Come eliminare un processo in background?

In uno dei nostri esempi nella sezione precedente, mettiamo in esecuzione il nostro script tesh.sh in background. La maggior parte dei processi in background, in particolare i comandi semplici, termineranno senza problemi.

Tuttavia, proprio come qualsiasi processo, uno in background potrebbe rifiutarsi di spegnersi facilmente. Il nostro script test.sh ha un PID di 2382, quindi emetteremo il seguente comando:

$ kill 2383

Nello screenshot, tuttavia, noterai che lo script ha ignorato il nostro comando kill:

Come abbiamo già appreso, kill -9 è il modo migliore per terminare un processo che è bloccato o si rifiuta di terminare.

Come uccidere i processi interrotti?

Può essere utile eliminare contemporaneamente tutti i lavori in background interrotti se si sono accumulati e non sono più utili per te. A titolo di esempio, stiamo eseguendo tre istanze del nostro script test.sh in background e sono state interrotte:

$ ./test.sh &

Puoi vedere questi processi con il comando ps:

$ ps -e | grep test.sh

Oppure, per ottenere semplicemente un elenco di tutti i lavori interrotti sul sistema, puoi eseguire il comando jobs:

$ jobs

Il modo più semplice per terminare tutti i lavori interrotti è con il seguente comando:

$ kill `jobs -ps`

Oppure usa l'opzione -9 per assicurarti che i lavori vengano terminati immediatamente:

$ kill -9 `jobs -ps`

Il comando `jobs -ps` elencherà tutti i PID dei lavori in esecuzione in background, motivo per cui siamo in grado di combinare il suo output con il comando kill per terminare tutti i processi interrotti.

Operazione kill non consentita

Se ricevi un errore "operazione non consentita" quando provi a terminare un processo, è perché non disponi delle autorizzazioni appropriate. Accedi all'account root o usa 'sudo' (sulle distribuzioni Debian) prima del comando kill.

$ sudo kill PID

Spero che il tutorial ti sia utile. Continua a tornare.


Linux
  1. Come uccidere un processo zombie su Linux

  2. 8 comandi Linux per una gestione efficace dei processi

  3. kill Esempi di comandi in Linux

  4. renice Esempi di comandi in Linux

  5. Esempi di comandi pkill in Linux

Linux nl Command Tutorial per principianti (7 esempi)

Tutorial sui comandi Linux nm per principianti (10 esempi)

Tutorial sui comandi principali di Linux per principianti (8 esempi)

30 esempi di comandi principali per il monitoraggio in Linux

Come KILL un processo su Linux

UNIX / Linux:7 esempi pratici di comandi PS per il monitoraggio dei processi