2009-04-20 158 views
31

Ho un processo VirtualBox attorno al quale ho provato ad uccidere (-KILL/-ABORT) ma senza successo. Il pid genitore è 1 (init).Come interrompere il processo 'non interrompibile' su Linux?

top indica il processo come D che è documentato come "interruzione del servizio".

strace non mostra nulla.

Come posso sbarazzarmi di questo? Mi impedisce di scaricare il driver del kernel di vbox per caricarne uno nuovo.

+0

Forse meglio su ServerFault? – dmckee

+0

Che non è ancora online - per quanto posso vedere. Grazie comunque per la mancia. –

risposta

36

Risposta semplice: non è possibile.

Risposta più lunga: il sonno ininterrotto significa che il processo non verrà risvegliato dai segnali. Può essere solo svegliato da ciò che sta aspettando. Quando ricevo tali situazioni, ad es. Con il CD-ROM, di solito ripristino il computer usando suspend-to-disk e riprendendo.

15

Lo stato D indica fondamentalmente che il processo è in attesa di I/O del disco o altro I/O di blocco che non può essere interrotto. A volte questo significa che il kernel o il dispositivo sta cercando febbrilmente di leggere un blocco errato (specialmente da un disco ottico). A volte significa che c'è qualcos'altro.

Il processo non può essere interrotto finché non esce dallo stato D. Scopri cosa sta aspettando e risolvilo. Il modo semplice è riavviare. A volte la rimozione del disco in questione aiuta, ma può essere piuttosto pericoloso: errore hardware irreparabile irreparabile se non si sa cosa si sta facendo (leggi: fumo che esce).

3

Recentemente ho riscontrato un processo nello stato D su un server remoto e vorrei chiarire che è necessario un riavvio temporaneo o il ciclo di alimentazione per rimuovere il processo.

Non provare a riavviare il software fino a quando non sono state esaurite tutte le altre opzioni. Ad esempio, puoi provare a liberare qualsiasi risorsa a cui il processo è sospeso. Un riavvio graduale potrebbe fornire un sistema parzialmente spento e che non risponderà più a ssh, ma non si riavvierà perché è bloccato nel tentativo di interrompere il processo di interruzione.

11

L'uccisione di un processo ininterrotto ha esito positivo, ma non lo fa immediatamente. Il processo non scomparirà finché non riceverà effettivamente il segnale. Quindi inviare un segnale da solo non è sufficiente per sbarazzarsi del processo, devi anche svegliarlo dal sonno ininterrotto.

Tanel Poder ha scritto un ottimo guide to analyse D state processes. È tipico che questo stato sia causato da I/O incompleto, ad es. errore di rete. slm ha pubblicato alcuni very useful pointers on superuser come rimuovere l'I/O di rete e anche il problema stesso.

Personalmente, quando ho a che fare con Windows su VirtualBox e anche con Wine, mi imbatto spesso in questo problema a causa di un I/O cdrom che non viene mai completato (suppongo che sia una sorta di controllo di presenza del disco). ATA devices can be reset, che probabilmente sbloccherà il processo. Per esempio, sto usando il seguente piccolo script per ripristinare entrambi i miei lettori ottici, Sbloccaggio processi che stanno bloccando:

echo 1 > /sys/block/sr0/delete 
echo 1 > /sys/block/sr1/delete 
echo "- - -" > /sys/class/scsi_host/host7/scan 
1

Come altri hanno detto, un processo di continuità è un processo che si è conficcata in una funzione del kernel che non può essere interrotto (di solito è in attesa di qualche operazione di I/O). Vedi this answer per una descrizione dettagliata.

A parte il riavvio del computer, ho avuto successo portando alcuni processi fuori dallo stato D da flushing linux VM caches:

kill -9 {process_id} 
sync 
echo 3 | sudo tee /proc/sys/vm/drop_caches 

questo non sembra influenzare la stabilità del sistema, ma io non sono un programmatore di sistemi e non sicuro quali conseguenze indesiderate questo potrebbe avere.


Edit:

Secondo il kernel docs, drop_caches sembra essere ragionevolmente sicuro in un ambiente di sviluppo.

drop_caches

scrivendo a Questo farà sì che il kernel a goccia cache pulite, così come oggetti slab recuperabili come dentries e inode. Una volta rilasciati, la loro memoria diventa libera.

per liberare pagecache:

echo 1 > /proc/sys/vm/drop_caches 

Per liberare gli oggetti slab recuperabili (include dentries e inode):

echo 2 > /proc/sys/vm/drop_caches 

agli oggetti slab gratuiti e pagecache:

echo 3 > /proc/sys/vm/drop_caches 

Questo è un'operazione non distruttiva e non libererà oggetti sporchi. Per aumentare il numero di oggetti liberati da questa operazione, l'utente può eseguire `sync ' prima di scrivere in/proc/sys/vm/drop_caches. Ciò ridurrà al minimo il numero di oggetti sporchi nel sistema e creerà più candidati a eliminati.

Questo file non è un mezzo per controllare la crescita delle varie cache del kernel (inode, dentries, pagecache, ecc ...) Questi oggetti sono automaticamente recuperati dal kernel quando è necessaria la memoria in altre parti del sistema.

L'utilizzo di questo file può causare problemi di prestazioni. Poiché elimina gli oggetti memorizzati nella cache, potrebbe costare una notevole quantità di I/O e CPU per ricreare gli oggetti rilasciati , specialmente se erano in uso intensivo. Per questo motivo, l'uso di al di fuori di un ambiente di test o di debug non è consigliato.

Si può visualizzare messaggi informativi nel log del kernel quando questo file è utilizzato :

cat (1234): drop_caches: 3 

Questi sono solo a titolo informativo. Non significano che qualcosa non va con il tuo sistema. Per disabilitarli, echo 4 (bit 3) in drop_caches.

Problemi correlati