Anzeige:
Ergebnis 1 bis 3 von 3

Thema: mysql verbindungsabruch im script abfangen

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33

    mysql verbindungsabruch im script abfangen

    Hallo,
    ich habe ein bash script das mir den status einiger mysql internen funktionen zurückgibt.

    Wenn jetzt aber der mysql server überhaupt nicht erreichbar ist, schickt mir cron eine meldung

    check_mysql_status.sh: line 63: [: =: unary operator expected
    check_mysql_status.sh: line 75: [: -ge: unary operator expected


    wenn ich auf der console die zuweisung der variablen test, gibt er die Fehlermeldung über den verbindungsabbruch nach zuweisung der variablen aus, so das diese leer bleibt, eine deklaration am anfang des scriptes hilft leider auch nicht, kann ich diese Ausgabe irgentwie umleiten oder abfangen?


    Code:
    ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.41.1' (113)
    
    ./work_check_mysql_status.sh: line 66: [: =: unary operator expected
    ./work_check_mysql_status.sh: line 78: [: -ge: unary operator expected
    hier einige auszüge aus dem script
    Code:
     CHK_SECONDS_BEHIND=`mysql -h "${SERVER_IP[server_no]}" -u monitoring --execute 'show slave status\G'|grep 'Seconds_Behind_Master:'|sed 's/      Seconds_Behind_Master: //' 2> /dev/null`
    
    
    if [ $CHK_SECONDS_BEHIND = "NULL" ]
        then
            echo -e " Slave on ${SERVER_NAME[server_no]} IP: ${SERVER_IP[server_no]}
            \n It seems to be unknown how far the slave is behind!
            \n Date: ${DATUM}"| mail -s "mysql replication error" $ADMIN_EMAIL
      else
            
            if [ $server_no = 5   ] ||  [ $server_no = 6   ] || [ $server_no = 7   ]
            then
                    BEHIND="15000"
            fi
    
            if [ $CHK_SECONDS_BEHIND -ge $BEHIND ]
            then
            #       echo  $CHK_SECONDS_BEHIND;
            echo -e " Server: ${SERVER_NAME[server_no]} IP: ${SERVER_IP[server_no]}
            \n Message: Server is out of timing($CHK_SECONDS_BEHIND seconds behind the master)!
            \n Date: ${DATUM}"| mail -s "mysql replication error" $ADMIN_EMAIL
            fi
      fi

    danke

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo.

    Zitat Zitat von Rogdab Beitrag anzeigen
    Code:
     CHK_SECONDS_BEHIND=`mysql -h "${SERVER_IP[server_no]}" -u monitoring --execute 'show slave status\G'|grep 'Seconds_Behind_Master:'|sed 's/      Seconds_Behind_Master: //' 2> /dev/null`
    Also die Umleitung "2>/dev/null" steht an der falschen Stelle, deshalb wird die Fehlermeldung von mysql ausgegeben. Ich würde die Umleitung direkt vor die Pipe an grep setzen, also
    Code:
    CHK_SECONDS_BEHIND=`mysql -h "${SERVER_IP[server_no]}" -u monitoring --execute 'show slave status\G' 2>/dev/null|grep 'Seconds_Behind_Master:'|sed 's/      Seconds_Behind_Master: //'`
    .
    Code:
    
    if [ $CHK_SECONDS_BEHIND = "NULL" ]
    Damit willst du überprüfen, ob $CHK_SECONDS_BEHIND leer ist, oder? Das müsstest du mit dem Parameter -z machen:
    Code:
    if [ -z "$CHK_SECONDS_BEHIND" ]
    . Du hast jetzt hier mindestens zwei Fehlerfälle zusammen: zum einen könnte der MySQL-Server nicht verfügbar sein und zum anderen könnte der MySQL-Befehl ein Empty Set zurückliefern.
    Code:
       then
            echo -e " Slave on ${SERVER_NAME[server_no]} IP: ${SERVER_IP[server_no]}
            \n It seems to be unknown how far the slave is behind!
            \n Date: ${DATUM}"| mail -s "mysql replication error" $ADMIN_EMAIL
       else
            
            if [ $server_no = 5   ] ||  [ $server_no = 6   ] || [ $server_no = 7   ]
            then
                    BEHIND="15000"
            fi
    
            if [ $CHK_SECONDS_BEHIND -ge $BEHIND ]
    Also der Fehler von deinem Eingangsposting sollte hier jetzt nicht mehr auftreten, ich weiß jetzt nicht genau, was dein MySQL-Befehl da oben macht, aber eventuell müsstest du noch $CHK_SECONDS_BEHIND überprüfen, ob es auch wirklich eine Zahl ist, z.B. mit
    Code:
    if [ -z "`echo $CHK_SECONDS_BEHIND|sed s/[0-9]*//`" ] 
    then
        if [ $CHK_SECONDS_BEHIND -ge $BEHIND ]
        then
        [...]
    .


    Gruß, Florian
    Geändert von ContainerDriver (27-02-2008 um 13:32 Uhr)
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33
    sieht gut aus, vielen dank.
    Die Tests liefen alle gut, ich hoffe es funkt nun.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •