uccidono i programmi -9 ma continuano a resistere


11

Ho provato a terminare tutti i miei lavori in background inviati in precedenza sotto KUbuntu da

kill -9 $(jobs -p)

Anche se questo comando ha immediatamente dato il messaggio simile

[1] Ho ucciso il mio 1

[2] Ho ucciso myjob2

Riesco ancora a vedere i loro processi sospesi nell'output di top e gli usi della CPU e della memoria non vengono modificati nell'output di uptime e gratuiti.

Quindi immagino di non averli uccisi correttamente. Qualcuno può spiegare cosa mi sta succedendo e cosa devo fare?

Ho scoperto che in cima, se digito k e inserisci il PID, posso uccidere i processi uno per uno. Quindi è diverso dal comando kill?

Ho anche trovato da qualche parte online http://www.ruhr.de/home/smallo/award.html di non raccomandare kill -9

Uso inutile di Kill -9 forma lettera

(Preventivo abominio)

No no no Non usare kill -9.

Non dà al processo la possibilità di pulire in modo chiaro:

1) chiudere i collegamenti delle prese

2) ripulire i file temporanei

3) informare i propri figli che sta andando via

4) ripristinare le caratteristiche del terminale

e così via e così via e così via.

In genere, invia 15 e attendi un secondo o due, e se non funziona, invia 2 e, se non funziona, invia 1. In caso contrario, RIMUOVI IL BINARIO perché il programma si comporta male!

Non usare kill -9. Non tirare fuori la mietitrebbia solo per mettere in ordine il vaso di fiori.

È vero? Che cosa significa "invia 15", "invia 2" e "invia 1"? Sono comandi stessi o "uccidi -15 PID", "uccidi -2 PID" e "uccidi -1 PID"?

Grazie e saluti!


La rimozione del file binario (file eseguibile) non interromperà da sola il processo. Il file system saprà che il processo sta utilizzando quel file e consentirà al processo di "vedere" il file anche dopo averlo rimosso.
Jeppe Stig Nielsen

Risposte:


9

Il tuo processo è probabilmente morto ma viene comunque visualizzato nella voce della tabella dei processi perché è un "processo di zombi". Quando un processo figlio è terminato e completamente scomparso (tranne la sua voce nella tabella dei processi) e il genitore non sarebbe in grado di recuperare il suo stato di terminazione (attraverso nessuna delle funzioni di attesa), si chiama zombi ... Uccidere (attraverso il segnale) uno zombi non vuole funziona perché è già terminato. Quello che devi fare è scoprire il suo processo genitore e uccidere thjat in modo pulito, quindi non usare kill - 9

ecco due semplici passaggi per uccidere uno zombi ...

  1. se il genitore è ancora vivo, prova ad ucciderlo (o SIGHUP è tutto ciò di cui hai bisogno)
  2. se il numero 1 fallisce, c'è un bug nel kernel .... reboot è il tuo amico e correggi quel bug: ->

Inoltro i miei lavori nella riga di comando e in background, quali sarebbero i loro genitori? E come posso trovare i loro genitori, se ce ne sono?
Tim

Usa il -fflag su ps per vedere i processi principali.
Jack M.

6

vedere man killuna definizione dei vari segnali disponibili, ma sì.

  • 15 è SIGTERM e chiede a un programma di uscire.
  • 2 è SIGINT ed è equivalente al Control-C
  • 1 è SIGHUP e indica che il terminale ha riagganciato.

Questi informano un processo che l'utente ha "finito" con il processo, anche se indicano ragioni leggermente diverse. SIGTERM potrebbe essere interpretato come "termina l'attività corrente, ma poi esce; non avviarne un altro", SIGINT significa "abbandonare ciò che "stai facendo ed esci", SIGHUP significa semplicemente che nessuno ascolta più (un processo del server potrebbe legittimamente reagire a SIGHUP interrompendo l'output della console e continuando a funzionare).

  • 9 è SIGKILL , ed è speciale in quanto è l'unico che il processo non può catturare e gestire internamente. Il risultato è semplicemente che il kernel non restituisce mai il controllo del processo, senza dargli alcuna possibilità di ripulire.

in cima, se digito k e inserisci il PID, posso uccidere i processi uno per uno. Quindi questo equivale ad alcune opzioni per il comando kill?
Tim

Sì, top invia solo un segnale al processo, proprio come uccide. AFAICT, il segnale predefinito che top usa è 15 (SIGTERM).
puetzk,


1

Significa digitare "kill -1" o "kill -15" invece di digitare "kill -9". Kill -9 è un proiettile hardcore in testa a qualsiasi processo in esecuzione, lo uccide in uno stato sporco che può causare perdite di memoria, blah blah.

Se stai digitando kill -9 e non funziona, cercherò di assicurarmi che il processo non venga rigenerato e che tu abbia l'autorizzazione per uccidere quel processo.


Come guarderesti per assicurarti che il processo non venga rigenerato? Dal momento che possiedo i processi, ho il permesso di uccidere quel processo?
Tim

Dovrebbe avere un numero di processo diverso se lo è. Quindi se fai ps -Al e vedi processA, allora uccidi -9 processA, e poi fai ps -Al e c'è ancora un processA nella coda del processo, assicurati che sia lo STESSO processA e non uno nuovo.
Satanicpuppy,

E ti dirà se non hai il permesso di terminare il processo.
Satanicpuppy,

0

Il segnale 9 è SIGKILL. L'invio di un SIGKILL richiede al sistema operativo di interrompere immediatamente il processo, senza fare domande. Il processo non viene notificato in anticipo e non ha alcuna possibilità di ripulire dopo se stesso.

Il segnale 15 è SIGTERM. L'invio di un SIGTERM richiede al sistema operativo di chiedere al processo di arrestarsi.

SIGKILL può essere ignorato se il sistema operativo pensa che il processo stia eseguendo IO o se si tratta di uno zombi (un processo figlio il cui genitore non ha ripulito dopo di esso).

SIGTERM può essere ignorato dall'applicazione, ma non è consigliabile che le applicazioni lo facciano, poiché i sistemi operativi inviano SIGTERM durante l'arresto, seguito a breve da SIGKILL se un programma è ancora in esecuzione.

Nota: la riga di comando killchiede sempre al sistema operativo di inviare un segnale all'applicazione, cosa che può o meno fare in base a chi possiede il processo, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.