PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten von Datei -> Perl -> (Shell) -> MySQL



theonlychriss
27-02-2002, 07:28
Wie kriege ich Daten aus einem Perl-Skript, das in einem Shell-Skript aufgerufen wird, in eine MySQL-DB?

Habe mir aus dem Forum ein paar Befehle zusammengeklaut und zusammengeworfen, allerdings fehlt mir der Hintergrund, wie man dann die Variablen, die in Perl angelegt wurden, in die DB "traffic_db" in die Tabelle "jahr" reinschreibe.
Mit einem Shell-Skript klappt's, aber dafür müßte ich die Perl-Variablen in "Shell-Variablen" übergeben und auch da weiß ich nicht weiter.

perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/; $RX+=$1; $TX+=$2; $RXMB=($RX/1024)/1024; $TXMB=($TX/1024)/1024;} print "mysql -u chriss -pmeinpasswort traffic_db INSERT INTO jahr VALUES ($RX,$TX);" ' traffic.log > test

Stellt euch anstelle der :( Doppelpunkt und Klammer auf vor. grrr.
Also sowas : ( (ohne Leerzeichen)

Wie man vielleicht sieht, soll der Traffic der Internet-Leitung aufgezeichnet werden. In der Datei traffic.log stehen die Werte, die aufgezeichnet wurden.
Später soll man dann per PHP einfach den Traffic pro Tag, Monat, Jahr und den gesamten ausgeben lassen können. Ist ein mini-Projekt, um PHP mit MySQL zu lernen. Aber erstmal müssen die Daten ja da rein.

Da gibt's bestimmt 'nen netten geronet, der sowas weiß:D
Gruß
Chriss

PS: habe schon 2 Stunden mit Suchen per Google und im Forum verbracht, aber bin auf keinen grünen Zweig gekommen.

formtapez
27-02-2002, 09:11
hey ... na wenn das mal nicht mein super traffic-logger ist ;) *GG

du kannst ja mal dein script posten, wenn es funktioniert ;-)

theonlychriss
27-02-2002, 10:03
:D :D :D
Ach, von Dir ist das. Habe viele Suchen gestartet und mir dann dieses zusammengestellt. Finde ich echt klasse!
Du weißt auch nicht zufällig, wie man mit Perl MySQL in der Art, wie ich es oben leihenhaft versucht habe, ansteuert?
Muß da was anderes stehen als print? Sowas wie execute und kann man dann den ganzen Senf, der folgt, quasi als ob man es in der Konsole eintippen würde, in MySQL reinknallen?

formtapez
27-02-2002, 17:29
also mit SQL kenn ich mich auch nicht aus... aber wenn dir Shell-Variablen ausreichen probier das mal :



perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/; $RX+=$1; $TX+=$2;} printf "%.3f %.3f\n",$RX / (1073741824), $TX / (1073741824) ' traffic.log > dumpfile

export superVariable=`cat dumpfile`
echo $superVariable
echo $superVariable


hoffe geholfen zu haben ;-)

M.f.G.
-formtapez-

theonlychriss
28-02-2002, 09:43
Heureka!

Nach langem Probieren und Lesen im Internet:

#/var/log/internet/traffic_script
cd /var/log/internet

/sbin/ifconfig ppp0 | grep "bytes:" | head -n 5 | tail -n 1 > traffic.log

perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/; $RX+=$1; $TX+=$2;} printf "%.0f\n%.0f\n", $RX/(2),$TX/(2) ' traffic.log > test

INTERFACE="ppp0"
IP=$(ifconfig $INTERFACE | grep inet | cut -d : -f 2 | cut -d \ -f 1)
export rx=`head -n 1 test`
export tx=`tail -n 1 test`
date=`date +%Y.%m.%d-%k:%M:%S`
echo $rx # nur zum Überprüfen, ob's klappt
echo $tx
echo $IP

echo "INSERT INTO jahr" > traffic
echo "VALUES ('${rx}','${tx}','$IP','${date}');" >> traffic
mysql -u chriss traffic_db < traffic

/sbin/ifconfig ppp0 | grep "bytes:" | head -n 5 | tail -n 1 > traffic.log

perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/; $RX+=$1; $TX+=$2;} printf "%.0f\n%.0f\n", $RX/(2),$TX/(2) ' traffic.log > test

INTERFACE="ppp0"
IP=$(ifconfig $INTERFACE | grep inet | cut -d : -f 2 | cut -d \ -f 1)
export rx=`head -n 1 test`
export tx=`tail -n 1 test`
date=`date +%Y.%m.%d-%k:%M:%S`
echo $rx # nur zum Überprüfen, ob's klappt
echo $tx
echo $IP

echo "INSERT INTO jahr" > traffic
echo "VALUES ('${rx}','${tx}','$IP','${date}');" >> traffic
mysql -u chriss traffic_db < traffic

Alles klar?
Puhh, das war für einen Newbee in Perl und Shell-Programmierung und überhaupt Programmierung nicht ganz einfach. Immer diese unterschiedliche Syntax und dann auch noch MySQL konfigurieren.

Naja, it works!
Gruß
Chriss

PS: Bestimmt sind im Code wieder Smilies drin, aber egal, die Zeichen dafür kennt man ja.

theonlychriss
20-03-2002, 09:11
Hallo formtapez!

Mir ging's immer auf die Nerven, dass Audiogalaxy nach einer Neuanwahl ins Internet immer aktiv blieb, aber keine Verbingung mehr zum Masterserver hatte. Da habe ich hier irgendwo einen Beitrag gelesen, um Prozess-IDs auszulesen (sehr einfach) und dachte mir, so krieg ich den AG klein. Und nach 10 Minuten war's soweit. Wen's interessiert, wie man den Satelliten automatisch beendet, hier ist die Lösung (starten muß man ihn dann wieder, was natürlich direkt hier drin geschehen könnte, aber dafür habe ich einen eigenen CRON-Job):

cd /var/log/internet

ps -fe | grep "./AGSatellite" | head -n 1 | tail -n 1 > ps.log

perl -e 'for(<>) { /root ([0-9]+)/; $PS+=$1} printf "%.0f\n", $PS ' ps.log > pstest

export PS=`head -n 1 pstest`
echo $PS # nur zum Überprüfen, ob's klappt
kill $PS

Vielleicht kann ich Dein Script ja noch etwas mehr zweckentfremden ;)
Grüße
Chriss

crackstorm
21-03-2002, 08:37
also wenn du ein programm killen willst, kannst du das ueber mehrer arten machen:
1. pid file (wenn man es hat)
2. killall (ist oft dabei)
3. kill `ps ax | grep prog_name | cut -c0-5`

die liste kann man noch beliebig erweitern, aber mir rechen diese 3 moeglichkeiten.

theonlychriss
22-03-2002, 06:07
das ist noch besser. Danke!