PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mysql verbindungsabruch im script abfangen



Rogdab
27-02-2008, 11:09
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?




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


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

ContainerDriver
27-02-2008, 13:29
Hallo.





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


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: //'`
.






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:


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.




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


if [ -z "`echo $CHK_SECONDS_BEHIND|sed s/[0-9]*//`" ]
then
if [ $CHK_SECONDS_BEHIND -ge $BEHIND ]
then
[...]
.


Gruß, Florian

Rogdab
27-02-2008, 14:45
sieht gut aus, vielen dank.
Die Tests liefen alle gut, ich hoffe es funkt nun.