Penso che questo tipo di personalizzazioni del comportamento del supervisore OTP non possa essere fatto facilmente. Il modo in cui sono progettati i supervisori OTP mi costringe a seguire alcune pratiche di progettazione rigorose. La cosa più importante in questo caso è che il supervisore non dovrebbe fare nient'altro che monitorare i propri figli e riavviarli in caso di interruzione anomala. Non ci dovrebbe essere alcuna logica aggiuntiva nel supervisore per non introdurre bug nei supervisori che sono parte critica dell'albero di supervisione e della tolleranza ai guasti.
quando il bambino muore voglio ripartire con lo stesso stato che aveva prima del crollo - questa è una cattiva pratica in generale, perché figlio potrebbe aver morto a causa dello stato corrotto che aveva prima di terminazione e riavviandolo con lo stesso stato in tal caso causerà sicuramente problemi
Esiste un approccio standard in questo caso? Personalizzare lo stato dei bambini all'interno del supervisore, prima di riavviarli agisce nei confronti delle buone pratiche di progettazione del supervisore. Pertanto questo tipo di attività viene solitamente svolto in modo diverso, ad esempio introducendo un altro processo, ad esempio gen_server, che sarebbe responsabile dell'avvio dei bambini tramite supervisore (supervisore: start_child) e mantenendo i monitor su tutti i processi. Questo processo aggiuntivo potrebbe eseguire qualsiasi personalizzazione richiesta prima di avviare un nuovo figlio.
Come ottenere Pid del processo di chiusura tramite OTP? - nel processo aggiuntivo che avvia i bambini tramite supervisore: start_child è possibile monitorarli e quindi ascoltare i messaggi GIÙ. Ad esempio in caso di gen_server si usa handle_info funzione di seguito:
handle_info({'DOWN', Ref, process, _Pid, _}, S) ->
handle_down_worker(Ref, _Pid, S).
O forse il suo possibile per ottenere lo stato del bambino poco prima di terminazione, e quindi ripristinare il bambino per lo stesso stato che aveva prima che incidentato? - Correggetemi se ho torto ma penso che non sia possibile in Erlang inviare, insieme al messaggio 'GIÙ', lo stato del processo che il bambino aveva, appena prima della conclusione. Se ciò fosse possibile, potrei semplicemente gestire un messaggio simile a {DOWN, Pid, Reason, State} e riavviare il processo con lo stesso stato o parte di esso. Ma poi, sto pensando .. Come hai potuto preservare lo stato del bambino che muore all'improvviso, che è stato ad esempio ucciso con l'uscita (Pid, uccidere)? Dubito che sarebbe possibile.
possibile duplicato di [Riavvio del processo di erlang e stato di conservazione] (http://stackoverflow.com/questions/13199528/restarting-erlang-process-and-preserving-state) –