2014-03-12 4 views
5

Ich verwende zookeeper in meinem Produkt (3.3.3). Während ich mit zoekeeper unter Windows arbeite, erstelle ich einen Dienst (mit prunsrv), Ich habe ein paar Fragen und Probleme. Eingestellt allen,Abfrage bezüglich Zookeeper Windows API starten/stoppen, mit Zk als Windows-Dienst (mit Hilfe von prunsrv)

Probleme: 1) zkServer.cmd nicht auf Win Server 2008-Rechner & Win 7 Enterprise (64 Bit beide) gestartet wurde, hatte die folgende Zeile ein,

java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* 

ersetzen

java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" 
      And it worked, could it be fixed in some other way? 

2) im zoo.cnf ich die dataDir angegeben, noch schafft es ein anderes Verzeichnis (ist/zookeeper-3.4.5zookeeper-3.4.5data/Version-2/snapshot) und speichert die dort Schnappschüsse.

Abfragen: 1) Es gibt keinen Start ist/mit zkServer.cmd stoppen, wie es in zkServer.sh wird, so dass im Grunde ist es mit zkServer.cmd begonnen, aber Also, wenn ich eine Strg + C/Z zu stoppen Ich beginne den Prozess, es ist ein Vordergrund-Prozess und wird getötet, wenn ich eine Strg + C

2) Ich muss einen Tierpfleger Dienst erstellen, und ich verwende prunsrv, um das zu tun. Ich habe die folgenden zwei Möglichkeiten herausgefunden.

a) 

prunsrv //IS//Zookeeper --DisplayName=" ZOOKEEPER Service" --Description=" ZOOKEEPER Service" --Startup=auto --StartMode=exe --StartPath=%ZOOKEEPER_HOME% --StartImage=%ZOOKEEPER_HOME%\bin\zkServer.cmd --StopTimeout=5 --LogPath=%LOGS_DIR% --LogPrefix=zookeeper --LogLevel=Info --PidFile=zookeeper.pid --StdOutput=auto --StdError=auto 


b) 

cd %ZOOKEEPER_HOME%\bin\ 
       call "%~dp0zkEnv.cmd" 
       set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain 
       prunsrv //IS//Zookeeper --DisplayName=" ZOOKEEPER Service" --Description=" ZOOKEEPER Service" --Jvm="%JVM_DLL%" --JvmOptions=!JAVA_OPTS! --Environment=zookeeper.log.dir=%ZOO_LOG_DIR%;zookeeper.root.logger=%ZOO_LOG4J_PROP%; --Startup=auto --LibraryPath=%LIB_DIR% --StartMode=jvm --Classpath=%CLASSPATH% %ZOOMAIN% %ZOOCFG% --StartClass=org.apache.zookeeper.server.quorum.QuorumPeerMain --StartMethod=start --StopMode=jvm --StopClass=org.apache.zookeeper.server.quorum.QuorumPeerMain --StopMethod=stop --StopTimeout=10 --LogPath=%LOGS_DIR% --LogPrefix=zookeeper --LogLevel=Info --PidFile=zookeeper.pid --StdOutput=auto --StdError=auto 

grundsätzlich im zweiten Ansatz bin ich mir alle Aufgaben von der zkServer.cmd getan tun

= >> Meine Suche ist in der zweiten Stufe (2b), das den Dienst beenden da sein sollte eine Stopp-Methode ausgesetzt, so dass, wenn ich den Dienst stoppe, wird es aufgerufen. Also wenn ich jetzt einen Dienst erstelle und ihn starte, läuft ZK gut, aber es dauert unendlich, also muss ich den Prozess beenden. Gibt es ein stop() für das gleiche, sehe ich ein shutdown(), aber es gibt keine Beschreibung dafür

Ich ging durch die Klasse org.apache.zookeeper.server.quorum.QuorumPeerMain, hier die main() ist die Startmethode (wenn mein Verständnis stimmt), und es sollte eine Methode geben, um den Prozess zu beenden.

bekam einfach auf den folgenden Link

https://issues.apache.org/jira/browse/ZOOKEEPER-1122, stellt eine Start/Stopp, aber der Anschlag hat einige Probleme

es führt den folgenden Fehler:

E:\zookeeper-3.4.5\zookeeper-3.4.5\bin>zkServer.cmd stop 
"JMX enabled by default" 
"Using config: E:\zookeeper-3.4.5\zookeeper-3.4.5\bin\..\conf\zoo.cfg" 
"Stopping zookeeper ... " 
ERROR: The process with PID 452 (child process of PID 4) could not be terminated. 
Reason: This is critical system process. Taskkill cannot end this process. 
ERROR: The process with PID 4 (child process of PID 0) could not be terminated. 
Reason: Access is denied. 
ERROR: The process with PID 0 (child process of PID 0) could not be terminated. 
Reason: This is critical system process. Taskkill cannot end this process. 
STOPED 

ich diesen Stoppbefehl leite auf einer Administratorkonsole.

E: \ zoekeeper-3.4.5 \ zoekeeper-3.4.5 \ bin> Aufgabenliste | findstr "java" java.exe 10324 Console 1 36036 K.

Jede Hilfe sehr

geschätzt würde

Antwort

4

Also, was Sie tun möchten, Zookeeper als Windows-Dienst ausgeführt wird.Ich hatte das gleiche Erfordernis, hier ist die Lösung, die ich ausgewählt habe:

  1. Erfordert: Zookeeper & prunsrv
  2. Set ZOOKEEPER_SERVICE Umgebungsvariable auf den Namen des Windows-Dienst zu erstellen, und ZOOKEEPER_HOME auf dem Weg zu der Tierheim-Ordner. Dann

    prunsrv.exe "//IS//%ZOOKEEPER_SERVICE%"^
         --DisplayName="Zookeeper (%ZOOKEEPER_SERVICE%)"^
         --Description="Zookeeper (%ZOOKEEPER_SERVICE%)"^
         --Startup=auto --StartMode=exe^
         --StartPath=%ZOOKEEPER_HOME%^
         --StartImage=%ZOOKEEPER_HOME%\bin\zkServer.cmd^
         --StopPath=%ZOOKEEPER_HOME%\^
         --StopImage=%ZOOKEEPER_HOME%\bin\zkServerStop.cmd^
         --StopMode=exe --StopTimeout=5^
         --LogPath=%ZOOKEEPER_HOME% --LogPrefix=zookeeper-wrapper^
         --PidFile=zookeeper.pid --LogLevel=Info --StdOutput=auto --StdError=auto 
    
  3. eine zkServerStop.cmd Datei in zookeeper Binärordner mit folgendem Inhalt hinzufügen:

    @echo off 
    setlocal 
    TASKLIST /svc | findstr /c:"%ZOOKEEPER_SERVICE%" > %ZOOKEEPER_HOME%\zookeeper_svc.pid 
    FOR /F "tokens=2 delims= " %%G IN (%ZOOKEEPER_HOME%\zookeeper_svc.pid) DO (
        @set zkPID=%%G 
    ) 
    taskkill /PID %zkPID% /T /F 
    del %ZOOKEEPER_HOME%/zookeeper_svc.pid 
    endlocal 
    

    (Natürlich muss es die beiden Umgebungsvariablen ZOOKEEPER_HOME & ZOOKEEPER_SERVICE eingestellt werden)

Hoffe es hilft,
Guillaume.