No. Una volta che un processo viene ucciso da OOM Killer, è morto. Puoi riavviarlo (se le risorse lo permettono), e se è qualcosa che è gestito dal sistema (tramite inittab, forse), potrebbe riavviarsi in quel modo.
Modifica: come esperimento mentale, pensa a cosa significherebbe una risurrezione di un processo. Anche se si potesse memorizzare l'intero stato del processo, non si vorrebbe farlo perché il processo potrebbe essere interrotto dalla REASON per la condizione di esaurimento della memoria.
Quindi il meglio che si potrebbe avere sarebbe di memorizzare il suo stato di avvio (riga di comando, ecc.). Ma non va bene, perché ancora una volta, questo potrebbe essere il motivo per cui il sistema ha esaurito la memoria in primo luogo!
Inoltre, se si resuscita un processo in questo modo, non si sa cosa potrebbe andare storto. Cosa succede se il processo controlla l'hardware? Cosa succede se i controlli di processo non devono essere eseguiti più di una volta? E se fosse collegato a una tty che non c'è più (perché lo sshd era uno dei processi uccisi)?
C'è una quantità ENORME di contesto attorno a un processo di cui il sistema non può essere a conoscenza. L'unica cosa sensata è la cosa che fa il kernel: uccidere il sucker e andare avanti.
Suppongo che tu possa immaginare una strategia di sospensione da disco a disco, ma dato che abbiamo esaurito la memoria (incluso lo swap), ciò significa o prenotare un po 'di spazio su disco o decidere di allocare spazio su disco a questo al volo. Ognuna delle quali strategia potrebbe non essere in grado di gestire la dimensione del processo in questione.
In breve: No, non puoi tornare dal killer di OOM. È un assassino, devi solo occupartene.
fonte
2009-12-22 15:00:46
Non capisco perché la gente vuole chiudere questo domanda in quanto molto orientata alla programmazione: in che modo i programmi devono fare i conti con le condizioni OOM/condizioni fuori OOM. – jldupont