2017-10-27 3 views
0

Ich bin neu der Erlang. Derzeit verwenden wir ejabberd für unseren xmpp-Dienst. In letzter Zeit habe ich ein Programm für verteilte Erlangungen geschrieben. Ich muss rpc ausführen: Anruf zwischen zwei Maschinen. Ich kann den rpc tun: ruf erfolgreich am erl simulator. Aber unser aktuelles System verwendete ejabberdctl, um den ejabberd-Dienst zu starten. Ich habe überprüft und versuche, die ejabberdctl-Datei zu ändern. Aber ich kann -setcookie nicht erfolgreich hinzufügen.Wie kann ich setcookie in ejabberdctl hinzufügen, um den ejabberd-Dienst auszuführen oder zwei Knoten auf einem anderen Computer ohne setcookie beim Start verbinden?

der Codeabschnitt in ejabberdctl ist

ctlexec() 
{ 
    CONN_NAME=$1; shift 
    [email protected] 
    $EXEC_CMD "$ERL \ 
    $NAME ${CONN_NAME} \ 
    -noinput \ 
    -hidden \ 
    -pa $EJABBERD_EBIN_PATH \ 
    $KERNEL_OPTS \ 
    -s ejabberd_ctl -extra $ERLANG_NODE $COMMAND" 
} 

das Problem durch die beiden letzten Zeile verursacht:

$KERNEL_OPTS \ 
    -s ejabberd_ctl -extra $ERLANG_NODE $COMMAND" 

Ich denke, diese Datei, bevor jemand die verwiesen wird, aber ich don Ich weiß nicht, woher es kommt. Weiß jemand, wie kann ich -setcookie abc zu diesem Befehl erl hinzufügen? Wenn ich die ejabberdctl-Datei oder den schlimmsten Fall nicht ändern kann, kann ich das aktuelle System nicht ändern. , d. H. Ich habe keine Chance, dem Ejabberd-System Setcookie hinzuzufügen. Wie kann ich meinen neuen Knoten mit dem vorhandenen ejabberd-Knoten (unserem aktuellen System) verbinden?

Der Ejabberd soll zuerst starten.

Antwort

0

Sie haben eine Lösung direkt vor der Nase. Wie funktioniert ctlexec()? Es läuft --hidden Knoten mit dem Namen $NAME ${CONN_NAME}, setzt Optionen $KERNEL_OPTS, fügt $EJABBERD_EBIN_PATH in den Suchpfad ein und ruft ejabberd_ctl:start() mit einigen zusätzlichen Parametern in $ERLANG_NODE $COMMAND auf. So muss -setcookie Cookie Parameter in $KERNEL_OPTS sein oder es verwendet Standard-Cookie in $HOME/.erlang.cookie. Es ist genau das, was Sie brauchen. Ersetzen Sie einfach -s ejabberd_ctl durch Ihr eigenes Modul und verwenden Sie $KERNEL_OPTS und $ERLANG_NODE Inhalte, die Sie bereits haben. Suchen Sie im Skript nach Hinweisen, was $KERNEL_OPTS und $ERLANG_NODE enthält.

Es ist eine übliche Art, wie Skripte wie ejabberd_ctl gemacht werden. Es ist ziemlich einfach und elegant. Sie führen nur Ihren eigenen Knoten aus und setzen ihn auf --hidden, damit Sie andere Knoten in einem Cluster nicht stören, wenn es solche gibt. Vergessen Sie nicht, einen zufälligen Knotennamen zu vergeben. Verbinden Sie sich mit dem Anwendungsknoten und machen Sie dann Ihre rpc:call/4,5 und das war's. Es gibt normalerweise einige Module wie ejabberd_ctl.erl, um es bequemer zu machen, zusätzliche Parameter zu verarbeiten und so weiter.

+0

Dank, schließlich, benutze ich die gemeinsame .erlang.cookie zwischen zwei Maschinen, um die Änderung der Ejabberctl-Datei zu vermeiden. Ich sehe diese Methode auch im Ejabberd-Dokument im Cluster-Bereich. –