Esistono funzioni che consentono a un processo OTP di trovare il pid del proprio supervisore?Come trovare il supervisore di un processo OTP?
risposta
I dati è nascosta nel dizionario di processo (di qualsiasi processo generato con proc_lib
) alla voce '$ancestors'
:
1> proc_lib:spawn(fun() -> timer:sleep(infinity) end).
<0.33.0>
2> i(0,33,0).
[{current_function,{timer,sleep,1}},
{initial_call,{proc_lib,init_p,3}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[]},
{dictionary,[{'$ancestors',[<0.31.0>]},
{'$initial_call',{erl_eval,'-expr/5-fun-1-',0}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.24.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,6},
{reductions,62},
{garbage_collection,[{min_bin_vheap_size,46368},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,0}]},
{suspending,[]}]
Qui la linea che ci interessa è {dictionary,[{'$ancestors',[<0.31.0>]},
.
Si noti che questo è il tipo di cose che raramente dovresti avere una ragione per usarti. Per quanto ne so, è principalmente usato per gestire la terminazione pulita negli alberi di supervisione piuttosto che l'introspezione per qualunque codice tu abbia. Maneggiare con cura.
Un modo più pulito di fare le cose senza intaccare le viscere sensibili di OTP sarebbe quello di fare in modo che il supervisore passi il proprio pid come argomento al processo quando lo avvia. Questo dovrebbe essere molto meno confuso per le persone che leggeranno il tuo codice.
Sì, sembra una buona idea. –
Anch'io vado con il pass del supervisore pid. È più semplice da implementare e mantenere. –
Se si vuole fare male, ecco la nostra soluzione:
%% @spec get_ancestors(proc()) -> [proc()]
%% @doc Find the supervisor for a process by introspection of proc_lib
%% $ancestors (WARNING: relies on an implementation detail of OTP).
get_ancestors(Pid) when is_pid(Pid) ->
case erlang:process_info(Pid, dictionary) of
{dictionary, D} ->
ancestors_from_dict(D);
_ ->
[]
end;
get_ancestors(undefined) ->
[];
get_ancestors(Name) when is_atom(Name) ->
get_ancestors(whereis(Name)).
ancestors_from_dict([]) ->
[];
ancestors_from_dict([{'$ancestors', Ancestors} | _Rest]) ->
Ancestors;
ancestors_from_dict([_Head | Rest]) ->
ancestors_from_dict(Rest).
- 1. Come riavviare il bambino con stato personalizzato usando il comportamento del supervisore Erlang OTP?
- 2. Perché il mio supervisore termina?
- 3. Erlang: OTP vs spawn
- 4. Quando utilizzare gen_server nelle applicazioni Erlang/OTP
- 5. Erlang OTP supervisione Java applicazione
- 6. supervisore - come eseguire più comandi
- 7. Elixir corretto modo OTP per strutturare un'attività a ciclo infinito
- 8. Come posso trovare l'ID di processo (pid) di un processo avviato in java?
- 9. Utilizzo di nginx con supervisore - processo nginx avviato più volte con conseguente errore di associazione
- 10. Impossibile trovare il processo figlio del modulo
- 11. Trovare un processo ID per nome
- 12. Uso del supervisore nella finestra mobile
- 13. Come trovare il motivo di un processo morto senza file di registro su unix?
- 14. Come trovare il numero di porta per un particolare ID di processo in unix?
- 15. Perché il processo di resque non può trovare l'oggetto?
- 16. In esecuzione celeryd_multi con supervisore
- 17. Coffeescript e nodo-supervisore insieme?
- 18. Librerie di registrazione per Erlang/OTP
- 19. Principi di OTP. Come separare il codice funzionale e non funzionale nella pratica?
- 20. Come visualizzare il processo attualmente in possesso di un semaforo?
- 21. Come posso passare argomenti all'eseguibile in nodemon (o nodo-supervisore)?
- 22. Visual Studio non riesce a trovare il processo w3wp
- 23. Come ottenere il PID di un processo che viene convogliato su un altro processo in Bash?
- 24. Abbiamo gli equivalenti di Akka/Scala per i comportamenti OTP?
- 25. Come uccidere un processo senza ottenere un'eccezione di "processo terminato"?
- 26. Tornado non si riavvia correttamente nel supervisore
- 27. Come registrare il processo di sincronizzazione complessa?
- 28. Come trovare il percorso da cui è in esecuzione il processo/eseguibile corrente?
- 29. Come posso trovare il processo Unix proprietario di una connessione locale Sleeping MySQL?
- 30. Come cambio il nome del processo di un Erlang VM?
Non ne ho idea, ma per quanto ne so è possibile ottenere i processi legati e il supervisore è uno di loro. – ZeissS