GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa succede se "uccidi -9" non funziona?

Ho un processo che non posso eliminare con kill -9 <pid> . Qual è il problema in un caso del genere, soprattutto perché sono il proprietario di quel processo. Pensavo che nulla potesse eludere quell'kill opzione.

Risposta accettata:

kill -9 (SIGKILL) funziona sempre, a condizione che tu abbia il permesso di terminare il processo. Fondamentalmente o il processo deve essere avviato da te e non essere setuid o setgid, oppure devi essere root. C'è un'eccezione:anche root non può inviare un segnale fatale al PID 1 (il init processo).

Tuttavia kill -9 non è garantito che funzioni immediatamente . Tutti i segnali, incluso SIGKILL, vengono consegnati in modo asincrono:il kernel potrebbe impiegare del tempo per consegnarli. Di solito, fornire un segnale richiede al massimo alcuni microsecondi, solo il tempo necessario al target per ottenere un intervallo di tempo. Tuttavia, se il bersaglio ha bloccato il segnale, il segnale verrà messo in coda finché il bersaglio non lo sblocca.

Normalmente, i processi non possono bloccare SIGKILL. Ma il codice del kernel può e i processi eseguono il codice del kernel quando chiamano le chiamate di sistema. Il codice del kernel blocca tutti i segnali quando l'interruzione della chiamata di sistema risulterebbe in una struttura dati mal formata da qualche parte nel kernel, o più in generale nella violazione di alcune invarianti del kernel. Quindi, se (a causa di un bug o di una progettazione errata) una chiamata di sistema si blocca indefinitamente, potrebbe non esserci alcun modo per terminare il processo. (Ma il processo farà essere ucciso se completa la chiamata di sistema.)

Un processo bloccato in una chiamata di sistema è in stato di sospensione. Il ps o top il comando lo mostrerà (sulla maggior parte degli unice) nello stato D (originariamente per "d isk”, penso).

Un classico caso di lunga sospensione ininterrotta è rappresentato dai processi che accedono ai file su NFS quando il server non risponde; le moderne implementazioni tendono a non imporre un sonno ininterrotto (ad es. sotto Linux, il intr l'opzione mount consente a un segnale di interrompere gli accessi ai file NFS).

Se un processo rimane inattivo per lungo tempo, puoi ottenere informazioni su ciò che sta facendo collegando un debugger ad esso, eseguendo uno strumento diagnostico come strace o dtrace (o strumenti simili, a seconda del tuo gusto unix) o con altri meccanismi diagnostici come /proc/PID/syscall sotto Linux. Vedere Impossibile uccidere il processo wget con `kill -9` per ulteriori discussioni su come indagare su un processo in modalità di sospensione ininterrotta.

Correlati:come funziona la licenza per il framework open source LGPL?

A volte potresti vedere voci contrassegnate con Z (o H sotto Linux, non so quale sia la distinzione) in ps o top produzione. Questi non sono tecnicamente processi, sono processi zombie, che non sono altro che una voce nella tabella dei processi, tenuta in giro in modo che il processo genitore possa essere notificato della morte di suo figlio. Andranno via quando il processo genitore presta attenzione (o muore).


Linux
  1. Che cos'è un Makefile e come funziona?

  2. Cos'è NGINX? Come funziona?

  3. Linux – Quando non dovrei uccidere -9 Un processo?

  4. Cos'è il DNS e come funziona?

  5. La ripetizione automatica non funziona

Che cos'è un server Web e come funziona un server Web?

Linux – Perché Setuid non funziona??

Cosa indica questa statistica del processo?

Come funziona un sistema di bilanciamento del carico? Che cos'è il bilanciamento del carico?

Quando non dovrei uccidere -9 un processo?

Cosa fa kill -- -0?