Frage

Ich möchte ein gearman-Server abfragen können, um zu bestimmen, wie viele Instanzen eines Arbeitnehmers Ich habe laufen (im Grunde ich sicherstellen möchten, dass RunTaskA verfügbar ist und RunTaskB ist verfügbar, wenn es keine Arbeiter diese Aufgaben sind Handhabung, ich will der Lage sein, einen Alarm zu versenden.

Gibt es eine Möglichkeit, dies zu tun?

Auch:. Mad Requisiten, wenn Sie wissen von einem PHP-Weg, um den gearman-Server abfragen

Bearbeiten : Ich weiß um die PHP gearman Erweiterung, die nativ verfügbar ist, aber ich bin nicht für eine Aufgabe Einreichung Erweiterung suchen, ich brauche etwas, das mir den gearman Server abfragen kann und sehen, wie viele Arbeitnehmer eine bestimmte Aufgabe zu dienen.

War es hilfreich?

Lösung

class Waps_Gearman_Server {

    /**
     * @var string
     */
    protected $host = "127.0.0.1";
    /**
     * @var int
     */
    protected $port = 4730;

    /**
     * @param string $host
     * @param int $port
     */
    public function __construct($host=null,$port=null){
        if( !is_null($host) ){
            $this->host = $host;
        }
        if( !is_null($port) ){
            $this->port = $port;
        }
    }

    /**
     * @return array | null
     */
    public function getStatus(){
        $status = null;
        $handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30);
        if($handle!=null){
            fwrite($handle,"status\n");
            while (!feof($handle)) {
                $line = fgets($handle, 4096);
                if( $line==".\n"){
                    break;
                }
                if( preg_match("~^(.*)[ \t](\d+)[ \t](\d+)[ \t](\d+)~",$line,$matches) ){
                    $function = $matches[1];
                    $status['operations'][$function] = array(
                        'function' => $function,
                        'total' => $matches[2],
                        'running' => $matches[3],
                        'connectedWorkers' => $matches[4],
                    );
                }
            }
            fwrite($handle,"workers\n");
            while (!feof($handle)) {
                $line = fgets($handle, 4096);
                if( $line==".\n"){
                    break;
                }
                // FD IP-ADDRESS CLIENT-ID : FUNCTION
                if( preg_match("~^(\d+)[ \t](.*?)[ \t](.*?) : ?(.*)~",$line,$matches) ){
                    $fd = $matches[1];
                    $status['connections'][$fd] = array(
                        'fd' => $fd,
                        'ip' => $matches[2],
                        'id' => $matches[3],
                        'function' => $matches[4],
                    );
                }
            }
            fclose($handle);
        }

        return $status;
    }

}

Andere Tipps

Für eine schnelle Überprüfung, ich benutze diese bash Einzeiler:

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730

Es öffnet sich eine Verbindung zu einem gearman Instanz auf localhost läuft, und sendet den „Status“ Abfrage. Diese enthält den Namen und die Zahl der Arbeitsplätze auf dieser Instanz. Die Informationen können dann verarbeitet werden, um mit grep / awk / WC usw. für die Berichterstattung und Alarmierung.

Ich habe auch das gleiche mit der „Arbeiter“ Abfrage, die zeigt alle angeschlossenen Arbeiter.

# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730

Der Schlaf ist die Verbindung lange genug offen für die Antwort zu halten.

Die vollständige Liste der Verwaltungsbefehle, und was die Ausgabemittel sind unter http: // gearman. org / index.php? id = Protokoll Nur Suche nach "Verwaltungsprotokoll"

Um auf d5ve Antwort zu erweitern, da netcat sitzen wird und auf dem Sockel warten, können Sie einen Parameter -w mit einer maximalen Anzahl von Sekunden zu laufen hinzuzufügen. Also, wenn Sie Abfrage- localhost:

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1

... sonst nie prompt auf einen Befehl zurück.

Soweit ich weiß, gibt es keine solche Erweiterung in gearman, Verwalten und Arbeiter Skript Überwachung liegt in der Verantwortung eines davon für diesen Zweck versuchen können -

Supervisord ist ein Python appliation für laufende Anwendung im Hintergrund und überwacht sie.

oder können Sie brian Mond ist verwenden gearman Manager

Ich glaube, Sie brauchen diese http://github.com/liorbk/php

Stumbled auf heute, habe es selbst nicht getestet, aber es sieht vielversprechend aus.

https://github.com/yugene/Gearman-Monitor

In Python können Sie wie folgt vor:

import gearman

admin_client = gearman.GearmanAdminClient(['127.0.0.1:4730',])
status = admin_client.get_status()
for w in status:
   if w["task"] == "YOUR_TASK_NAME":
      print(w)

Hinweis : Sie müssen Paket "gearman" mit Pip genannt installieren oder easy_install alle Ausnahmen zu vermeiden, den obigen Code ausgeführt

.

Überprüfen Sie auch die folgenden Admin-Clients, die vereinfacht wird gearman im allgemeinen verabreicht wird.

Wenn alles andere fehlschlägt, können Sie die gearadmin Werkzeug in der gearman-tools Paket in Ubuntu verwenden Sie von exec() nannte es in dem neuen Prozess auszuführen. Hier ist href="https://stackoverflow.com/questions/20750896/gearman-gearadmin-command-line-tool-status-output-meaning">.

Dies setzt voraus, PHP und Gearman auf demselben Server ausgeführt werden.

scroll top