Mysql script problem

Konfiguration av nätverk, hur man använder Ubuntu som server, och håller sin dator säker
sampe90
Inlägg: 12
Blev medlem: 17 jan 2011, 17:12
OS: Annat GNU/Linux
Kontakt:

Mysql script problem

Inlägg av sampe90 »

Hej linux folks
Jag skulle behöva lite hjälp med att få en script att fungera att köra från crontab.
Det skripten ska göra är att kolla om mysql statusen är start/running eller stop/waiting.
Och ifall statusen är stop/waiting så ska den slå igång mysql så att statusen bilr start/running.
Jag har en script som jag hittat på nätet som fungerar när jag kör den manuelt. Men det konstiga är att när jag kör den som crontab job så fungerar det inte.
Av någon anledning så får jag INTE samma output text när jag kör /etc/init.d/mysql status via cronjob/crontab som när jag kör samma kommando manuelt direkt.
Output texten ska ju bli någont som typ:

Kod: Markera allt

mysql start/running, process 17355
Men på crontab blir den:

Kod: Markera allt

* /usr/bin/mysqladmin  Ver 8.42 Distrib 5.5.55, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          5.5.55-0ubuntu0.14.04.1
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 2 hours 25 min 59 sec

Threads: 3  Questions: 1188265  Slow queries: 0  Opens: 7143  Flush tables: 1  Open tables: 400  Queries per second avg: 135.662
Och därför så fungerar ju inte scripten häller.

Såhär ser scripten ut:

Kod: Markera allt

#!/bin/bash
UP=$(/etc/init.d/mysql status | grep running | grep -v not | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "MySQL is down.";
        service mysql start

else
        echo "Mysql is still running.";
fi
Scripten fungerar när jag kör den manuelt men inte som cronjob/crontab för root.
Om man kör crontab från en annan user än root så står det alltid att mysql inte kör fast den kör.
Någon som vet vad felet är?

Jag kör ubuntu server 14.04.5 LTS
Mysql v5.5.55
Körs på VMware VPS
Användarvisningsbild
johanre
Serveradmin
Inlägg: 3888
Blev medlem: 22 okt 2006, 09:13
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Malmö

Re: Mysql script problem

Inlägg av johanre »

En av sakerna man behöver lära sig med cronjobb är att de inte exekveras med riktigt samma miljö som den man får vid inloggning i ett skal / en terminal. Däribland PATH variablen är inte alltid satt så som man förväntar sig. Då finner man alltså inte alltid sökvägen till binärer. Därför är det klokt att skriva script som skall köras som cronjobb med fulla sökvägar till binärer. T.ex i ditt fall:

Kod: Markera allt

#!/bin/bash
UP=$(/etc/init.d/mysql status | grep running | grep -v not | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "MySQL is down.";
       /usr/sbin/service mysql start

else
        echo "Mysql is still running.";
fi
Alternativt ser man till att cronjobben läser in den miljö man vill ha:

Kod: Markera allt

#!/bin/bash
source /etc/profile
UP=$(/etc/init.d/mysql status | grep running | grep -v not | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "MySQL is down.";
        service mysql start

else
        echo "Mysql is still running.";
fi
Det finns såklart ett otal varianter, men det är det som är principen.
sampe90
Inlägg: 12
Blev medlem: 17 jan 2011, 17:12
OS: Annat GNU/Linux
Kontakt:

Re: Mysql script problem

Inlägg av sampe90 »

Tack för hjälpen johanre.
Dok så får jag fortfarande inte riktigt till det.
Jag får fortfarande samma output text fastän jag lägger till

Kod: Markera allt

source /etc/profile
Jag provade köra med

Kod: Markera allt

source ~/.profile
men fortfarande med samma resultat.
Är det något mer jag måste lägga till i scripten?
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: Mysql script problem

Inlägg av Gunnar Hjalmarsson »

Om det är ett PATH-problem, så hjälper det inte att läsa in /etc/profile. Pröva johanres första förslag i stället.
sampe90
Inlägg: 12
Blev medlem: 17 jan 2011, 17:12
OS: Annat GNU/Linux
Kontakt:

Re: Mysql script problem

Inlägg av sampe90 »

Gunnar Hjalmarsson skrev:Om det är ett PATH-problem, så hjälper det inte att läsa in /etc/profile. Pröva johanres första förslag i stället.
Jag prövade göra så också men med samma resultat.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Mysql script problem

Inlägg av Osprey »

När det gäller cron-jobb, så bör man alltid själv ange hela path:en till ett kommando. Det vill säga att man alltid anger "/bin", "/usr/bin", "/sbin", "/usr/sbin" eller vad det nu är framför ett kommando, istället för att förvänta sig att systemet letar upp det som det gör i en interaktiv shell. Nu är det iofs inget problem med "/bin" och "/usr/bin" eftersom man knappast kan undvika att ha den i sin PATH, men allt annat bör uttryckligen anges... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
sampe90
Inlägg: 12
Blev medlem: 17 jan 2011, 17:12
OS: Annat GNU/Linux
Kontakt:

Re: Mysql script problem

Inlägg av sampe90 »

Nu uppdaterade jag scripten till:

Kod: Markera allt

#!/bin/bash
PATH=/bin:/usr/bin:/use/sbin
source /etc/profile
UP=$(/etc/init.d/mysql status | grep stopped | grep -v not | wc -l);
if [ "$UP" -ne 0 ];
then
        echo "MySQL is down.";
        /etc/init.d/mysql start

else
        echo "Mysql is still running.";
fi
Denna fungerar.
Men det blev inte helt som jag tänkte i börja.
Om jag förstått detta rätt så när crontab kör

Kod: Markera allt

/etc/init.d/mysql status
så loggar den in på mysql server med den info som finns under /etc/mysql/debian.cnf och visar samma typ av status info som om du logga in i mysql och skriver

Kod: Markera allt

mysql> status
Men när man kör manuellt i shell /etc/init.d/mysql status
så får man t.ex. denna info:

Kod: Markera allt

mysql start/running, process 6665
Jag antar att felet kanske är i scripten för mysql "/etc/init.d/mysql"

Jag märkte också att nu när jag kör htop så visas mysql processerna lite annorlunda.
Förr stod det bara /usr/sbin/mysqld under Command.
Och nu står det

Kod: Markera allt

/usr/sbin/mysqld --basdir=/usr --datadir=/var/lib/mysql --plugins=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
Det är inget problem för mig. Men det skulle vara kul att få reda på varför det blir så?
Och om det kan uppstå några andra problem? Förutom att service mysql status/stop/start/restart verkar köras på en annan process.
Användarvisningsbild
johanre
Serveradmin
Inlägg: 3888
Blev medlem: 22 okt 2006, 09:13
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Malmö

Re: Mysql script problem

Inlägg av johanre »

sampe90 skrev: Denna fungerar.
Bra!
sampe90 skrev: Men det blev inte helt som jag tänkte i börja.
Om jag förstått detta rätt så när crontab kör

Kod: Markera allt

/etc/init.d/mysql status
så loggar den in på mysql server med den info som finns under /etc/mysql/debian.cnf och visar samma typ av status info som om du logga in i mysql och skriver

Kod: Markera allt

mysql> status
Hhhmm, var har du fått det ifrån? Det är nämligen inte alls så. Tittar du i koden för /etc/initd.mysql så står det bl.a:

Kod: Markera allt

# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
    ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))

    ps_alive=0
    pidfile=`mysqld_get_param pid-file`
    if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
    
    if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
       [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
        return 0 # EXIT_SUCCESS
    else
        if [ "$2" = "warn" ]; then
            echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
        fi
        return 1 # EXIT_FAILURE
    fi
}
Alltså inget som gör en mysql inloggning. Det är bara lite scriptning för att ta reda på vilket process ID som mysql har.
sampe90 skrev: Jag märkte också att nu när jag kör htop så visas mysql processerna lite annorlunda.
Förr stod det bara /usr/sbin/mysqld under Command.
Och nu står det

Kod: Markera allt

/usr/sbin/mysqld --basdir=/usr --datadir=/var/lib/mysql --plugins=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
Det är inget problem för mig. Men det skulle vara kul att få reda på varför det blir så?
Det är bara en konsekvens av att htop har uppgraderats och förbättrats över tid.
sampe90 skrev: Och om det kan uppstå några andra problem? Förutom att service mysql status/stop/start/restart verkar köras på en annan process.
Hhhmm, förstår inte riktigt vad du menar?
Användarvisningsbild
johanre
Serveradmin
Inlägg: 3888
Blev medlem: 22 okt 2006, 09:13
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Malmö

Re: Mysql script problem

Inlägg av johanre »

Och förresten; varför gör du det här ens? En mysql server skall inte gå ner så ofta att du skall behöva knåpa ihop ett script för att starta den igen... Det antyder att det finns andra fel att jobba med.
sampe90
Inlägg: 12
Blev medlem: 17 jan 2011, 17:12
OS: Annat GNU/Linux
Kontakt:

Re: Mysql script problem

Inlägg av sampe90 »

johanre skrev:
sampe90 skrev: Men det blev inte helt som jag tänkte i börja.
Om jag förstått detta rätt så när crontab kör

Kod: Markera allt

/etc/init.d/mysql status
så loggar den in på mysql server med den info som finns under /etc/mysql/debian.cnf och visar samma typ av status info som om du logga in i mysql och skriver

Kod: Markera allt

mysql> status
Hhhmm, var har du fått det ifrån? Det är nämligen inte alls så. Tittar du i koden för /etc/initd.mysql så står det bl.a:

Kod: Markera allt

# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
    ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))

    ps_alive=0
    pidfile=`mysqld_get_param pid-file`
    if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
    
    if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
       [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
        return 0 # EXIT_SUCCESS
    else
        if [ "$2" = "warn" ]; then
            echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
        fi
        return 1 # EXIT_FAILURE
    fi
}
Alltså inget som gör en mysql inloggning. Det är bara lite scriptning för att ta reda på vilket process ID som mysql har.
Du får ursäkta mig. Jag försöker bara förstå mig på hur det fungerar.
Är fortfarande lite ny till hur bash scripts fungerar.

Detta är bara en tillfällig script som jag kör tills jag kan lista ut varför mysql-servern kraschar mitt på natten ibland.
Användarvisningsbild
johanre
Serveradmin
Inlägg: 3888
Blev medlem: 22 okt 2006, 09:13
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Malmö

Re: Mysql script problem

Inlägg av johanre »

sampe90 skrev: Du får ursäkta mig. Jag försöker bara förstå mig på hur det fungerar.
Är fortfarande lite ny till hur bash scripts fungerar.

Detta är bara en tillfällig script som jag kör tills jag kan lista ut varför mysql-servern kraschar mitt på natten ibland.
Absolut inga problem! Att lära sig nytt kräver tid och lite tankefel :-)
Skriv svar

Återgå till "Nätverk, säkerhet och servrar"