2017-10-27 5 views
0

나는 Erlang을 처음 사용했다. 현재 우리는 xmpp 서비스에 ejabberd를 사용하고 있습니다. 최근에 일부 기능 문제에 대한 회비로 배포 된 erlange 프로그램을 작성했습니다. 두 대의 컴퓨터 사이에서 rpc : call을 실행해야합니다. erl 시뮬레이터에서 rpc : call을 성공적으로 수행 할 수 있습니다. 그러나 우리의 현재 시스템은 ejabberdctl을 사용하여 ejabberd 서비스를 시작했습니다. 확인하고 ejabberdctl 파일을 수정하려고합니다. 하지만 -setcookie를 성공적으로 추가 할 수는 없습니다.ejabberd 서비스를 실행하기 위해 ejabberdctl에 setcookie를 추가하거나 시작시 setcookie없이 다른 컴퓨터에 두 개의 노드를 연결하려면 어떻게해야합니까?

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

생각이 파일이 어떤 하나의 이전을 참조하지만 돈 :

ejabberdctl의 코드 섹션

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" 
} 

마지막 두 라인으로 발생하는 문제입니다 어디에서 왔는지 알 수 없습니다. 누구나 어떻게이 erl 명령에 -setcookie abc를 추가 할 수 있는지 알고 있습니까? ejabberdctl 파일 또는 최악의 경우를 변경할 수 없으면 현재 시스템을 변경할 수 없습니다. 즉 ejabberd 시스템에 setcookie를 추가 할 수있는 기회가 없습니다. 새 노드를 기존 ejabberd 노드 (현재 시스템)에 어떻게 연결할 수 있습니까?

ejabberd가 먼저 시작한다고 가정합니다.

답변

0

코 바로 아래에 해결책이 있습니다. ctlexec()은 어떻게 작동합니까? 노드 $NAME ${CONN_NAME}을 실행하고 옵션 $KERNEL_OPTS을 설정하고 검색 경로에 $EJABBERD_EBIN_PATH을 삽입하고 $ERLANG_NODE $COMMAND에 몇 가지 추가 매개 변수를 사용하여 ejabberd_ctl:start()을 호출합니다. 따라서 $KERNEL_OPTS-setcookie Cookie 매개 변수가 있거나 $HOME/.erlang.cookie에 기본 쿠키가 사용됩니다. 그것은 정확히 당신이 필요로하는 것입니다. -s ejabberd_ctl을 자신의 모듈로 바꾸고 이미 가지고있는 $KERNEL_OPTS$ERLANG_NODE 콘텐츠를 사용하십시오. 스크립트에서 $KERNEL_OPTS$ERLANG_NODE에 포함 된 단서를 검색하십시오.

ejabberd_ctl과 같은 스크립트가 작성되는 일반적인 방법입니다. 그것은 꽤 간단하고 우아합니다. 자신의 노드를 실행하여 --hidden으로 설정하면 클러스터의 다른 노드를 방해하지 않도록 할 수 있습니다. 임의의 노드 이름을 설정하는 것을 잊지 마십시오. 애플리케이션 노드에 연결 한 다음 rpc:call/4,5을 실행하면됩니다. 일반적으로 ejabberd_ctl.erl과 같은 일부 모듈을 사용하면 더 편안하게 처리하고 추가 매개 변수를 처리 할 수 ​​있습니다.

+0

감사합니다. 마지막으로 ejabberctl 파일의 수정을 피하기 위해 두 대의 컴퓨터간에 공유 .erlang.cookie를 사용합니다. 또한 클러스터 섹션의 ejabberd 문서에서이 방법을 볼 수 있습니다. –