Automatisch mit DB verbinden bei neustart [problem gelöst]

Bash, Shell, PHP, Python, Perl, CGI
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

Hi,
zur Zeit baue ich die Verbindung zu einer externen mysql db per ssh mit Screen auf. Das funktioniert soweit auch ganz gut, solange halt keine Unterbrechung der Verbindung da ist oder ich den rechner neustarten muß.

Nun meine frage.
Gibt es eine Möglichkeit die Verbindung so dauerhaft aufzubauen , dass sie z.b nach einer Verbindungstrennung automatisch wieder aufgebaut wird und auch automatisch wieder hergestellt wird wenn der Rechner mal neu gestartet wird.

Gruß
Deejoy
Last edited by deejoy on 2005-04-02 23:39, edited 1 time in total.
phillux
Posts: 80
Joined: 2004-03-16 13:47
Location: Münster

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by phillux »

Hm, ich versuche mal hier eine Lösung anzubieten, die bei mir eine Anwendung überwacht/startet. Allerdings nutze ich nicht (mehr) Screen um die Anwendung im Hintergrund zu starten:

start.sh

Code: Select all

/pfad/start.sh >/dev/null 2>&1 &
echo $! >/pfad/anwendung.pid
In anwendung.pid wird nun(wen wunderts;-)) die PID geschrieben. Ein weiteres Skript wird bei mir per Cronjob jede Minute aufgerufen. Das würde ungefähr so aussehen:

cronstart.sh

Code: Select all

#!/bin/sh
dir=/pfad/
pidfile=/pfad/anwendung.pid
cd $dir
if [ -f $pidfile ]; then
   kill -0 `cat $pidfile` >/dev/null 2>&1
   if [ $? -ne 0 ]; then
      ./start.sh >/dev/null 2>&1
   fi
else
   ./start.sh >/dev/null 2>&1
fi
Sollte der entsprechende Dienst nun beendet werden(egal ob durch Absturz oder Serverneustart) wird dies spätestens nach einer Minute überprüft und bei Bedarf neugestartet.

Gruß, P.
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

Hi,
erstmal danke für den Lösungsansatz auch wenn ich noch nicht ganz weiß wie ich den umsetzen muß /kann.

also ich stelle die Verbindung so her

Code: Select all

ssh -N -T -L -f 4000: 192.168.1.1:3306 user@192.168.1.1
normalerweise lasse ich das so in Screen laufen.

wie bekomme ich das den jetzt in dein script eingefügt ? Zumal ja noch die Passwortabfrage kommt.
Auch das mit der PID ist mir nicht so ganz klar. die ändert sich doch oder ?

Gruß
Deejoy
phillux
Posts: 80
Joined: 2004-03-16 13:47
Location: Münster

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by phillux »

Hm, ich weiss nicht, ob es möglich ist das Kennwort direkt in die Kommandozeile einzufügen. Vielleicht geht das mit einem Zertifikat? Kenne mich da aber nicht so aus...

Wenn es dann klappen würde, mit dem direkten Login, dann würde eine Startdatei ungefähr so aussehen:

Code: Select all

#!/bin/sh
ssh -N -T -L -f 4000: 192.168.1.1:3306 user@192.168.1.1 >/dev/null 2>&1 &
echo $! >/pfad/anwendung.pid 
Die PID der gestarteten ssh Instanz steht dann in anwendung.pid. Mit der Datei, die per Cronjob gestartet wird, überprüfst du dann automatisch, ob das Programm mit der PID noch läuft. Wenn nicht, wird die Startdatei wieder aufgerufen und die neue, aktuelle PID in anwendung.pid geschrieben.

Sollte funktionieren, soweit das Problem mit der Passwortabfrage gelöst ist. Aber da kenne ich mich, wie gesagt, nicht so gut aus.

Viel Glück, Gruß, P.
tcs
Posts: 107
Joined: 2003-11-16 12:05
Location: Woodcastle

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by tcs »

Ich glaub das ist alles viel zu kompliziert...
Was spricht gegen einen public key ohne Passwort?
Sicherheitstechnisch natürlich bedenklich, aber wenn z.B. nur 2 Serveradmins Shellzugriff haben sollte das auch kein Problem sein.
Der private key muß halt besonders sorgfältig behandelt werden.

Cheers

tcs
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

Hi,
danke.
Ich blick zwar noch nicht so ganz mit der PID durch aber da werde ich mich mal durchwühlen.
Das mit dem Passwort ist noch so ein echtes Problem. Ja per Key wäre ein Login ohne passwort möglich das wollen die aber nicht.
Na mal schauen ob ich was finde

Vielen dank erstmal für denguten ansatz

Gruß
Deejoy
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

tcs wrote:Ich glaub das ist alles viel zu kompliziert...
Was spricht gegen einen public key ohne Passwort?
Sicherheitstechnisch natürlich bedenklich, aber wenn z.B. nur 2 Serveradmins Shellzugriff haben sollte das auch kein Problem sein.
Der private key muß halt besonders sorgfältig behandelt werden.

Cheers

tcs
Genau das der andere Admin das nicht möchte ;). Sonst wäre es kein Poblem
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

Hi mit dem teil klappt das ganz gut

Code: Select all

#!/usr/bin/expect

set PASSWORT meinpasswd
set USER admin

set ROUTER 192.168.1.1

spawn ssh -l $USER $ROUTER
sleep 30
exp_send "$PASSWORTn"
interact 
phillux
Posts: 80
Joined: 2004-03-16 13:47
Location: Münster

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by phillux »

tcs wrote:Ich glaub das ist alles viel zu kompliziert...
Was meinst Du, ist zu kompliziert? Er möchte doch gerne sichergestellt haben, dass die Verbindung wiederaufgenommen wird, sollte sie unterbrochen werden...

Mit dem Public Key wäre eine Lösung, auf das Passwort zu verzichten...
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

@Phillux

Kannst Du mir das mit der anwendung.pid noch mal genauer erklären. Da steigt ich nicht ganz durch.
Also ich habe jetzt eine datei die heist ex.sh und wird mit expect ex.sh gestartet.
Dann baut sich eine Verbindug per ssh auf.
Si und wenn diese abgebrochten wird soll die datei ex.sh noch mal gestartet werden
was muss ich den jetzt hier eintragen
echo $! >/pfad/anwendung.pid
und wo bekomme ich die pid her ?
wenn ich es richtig verstanden habe müsste der teil /pfad/anwendung.pid so aussehen
/usr/bin/ssh.pid oder ? wobei die pid duchr die jeweilige zu ersetzten ist ?!
deejoy
Posts: 7
Joined: 2004-06-14 23:52

Re: Automatisch mit DB verbinden bei neustart [problem gelöst]

Post by deejoy »

So hab mitlerweile eine Lösung für mein Problem gefunden.
Hier wie ich es gemacht habe.

als erstes habe ich per apt

Code: Select all

apt-get install expect
installiert.

dann habe ich unter

Code: Select all

/var/lib
einen ordner connect angelegt.

dort ist einmal die

start.sh

Code: Select all

#!/bin/sh                                                                                                                                       
                                                                                                                                                                                                                                                                                          //prüft ob schon ein prozess vorhanden ist wenn ja wird er gekillt
MYSQL_PID=`ps ax | grep mysql_connect |grep -v grep| nawk '{print $1}'`                                                                         
                                                                                                                                                
if [ "$MYSQL_PID != "" ]                                                                                                                        
then                                                                                                                                            
   kill -9 $MYSQL_PID                                                                                                                           
   fi                                                                                                                                           
                                                                                                                                                
 CON_PID=`ps ax |  grep res@dbprod.xxxx.de |grep -v grep| nawk '{print $1}'`                                                              
                                                                                                                                                
   if [ "$CON_PID != "" ]                                                                                                                       
   then                                                                                                                                         
      kill -9 $CON_PID                                                                                                                          
         fi                                                                                                                                     
                                                                                                                                                
                                                                                                                                                
                                                                                                                                                expect /var/lib/connect/mysql_connect.sh &>/dev/null



und die mysql_connect.sh

Code: Select all

#!/usr/bin/expect -f                                                                                                                            
                                                                                                                                                
set PASSWORT test                                                                                                                            
set USER res                                                                                                                             
                                                                                                                                                
                                                                                                                                                
set timeout 25                                                                                                                                  
                                                                                                                                                
spawn ssh -N -T -L 4000:217.77.77.67:3306 res002@dbprod.xxxxx.de                                                                              
expect "assword:"                                                                                                                               
exp_send "$PASSWORTr"                                                                                                                          
interact   
in der start.sh wird jedesmal überprüft ob schon ein Prozess vorhanden ist und wenn ja wird dieser gekillt und auch die Verbindung wird getrennt sonst wären bei eine kurzzeitigen Unterbrechung 2 Verbindungen offen und auch Prozesse am laufen.

So nun habe ich noch in der /etc/inittab folgendes eingefügt

Code: Select all

10:23:respawn:/var/lib/connect/start.sh tty10 
Hiermit wird das ganze gestartet.

wird nun der Server neu gestartet wird die VErbindung automatisch hergestellt genauso wenn ein Prozess gekillt wird oder die gegenseite einen ausfall hatte.