FoxMulder
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
Hallo zusammen, ich hätte da mal eine Frage. Und zwar lasse ich für einen Shop verschiedene Artikellisten einlesen und den Lieferstand in die DB schreiben.
Das ganze erfolgt mit einem kleinen BashScript.
Es wird aus einer TXT Datei die Artikelnummer ausgelesen (mit "cat") und dann mit Hilfe von "grep", "awk", "sed" etc. der Lieferstatus aus den Quellen der Lieferanten ausgelesen. (das ist mal eine Webseite und mal eine CSV). Das Ergebnis wird dann in die DB geschrieben.
Soweit klappt das auch alles wunderbar! ☺ Das ganze läuft auch automatisch via Cron.
Leider erhalte ich bei 2 Lieferanten eine Mail vom Crondienst mit folgendem Inhalt: cat: write error: Broken pipe oder auch iconv: error while closing output file: Broken pipe Leider konnte ich über Google keine passende Antwort dazu finden. Das Script scheint auch trotzdem durch zu laufen. :-/ Zumal bei 3 anderen Lieferanten keine solche Meldungen generiert werden. Das verwendete Script ist jedoch das selbe, jedoch halt für den jeweiligen Lieferanten angepasst (URL, Quelle, etc.). Was bedeutet diese Meldung? Achso...das ganze wird auch einem Debian VServer betrieben. 😉 Vielen Dank für eure Hilfe! LG
Fox P.S.: Wenn ihr das Script zur Analyse braucht sagt bescheid. 😉
|
coffeeholic
Anmeldungsdatum: 10. August 2012
Beiträge: 1938
Wohnort: ::1
|
Kann es sein, dass die Textdateien, bei welchen der Fehler auftritt, extrem lang sind?
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
also die Arikelnummern habe ich nach Lieferant sortiert...ergo immer eine andere Liste für die Nummern zum auslesen.
Ja stimmt...bei 2 Lieferanten sind dies mehrere Tausend Zeilen mit je einer Nummer...aber bei dem anderen Lieferanten sind es wesentlich weniger...nur ein paar Hundert.
Ich habe auch Listen mit mehreren Tausend wo dies nicht auftritt...:-/ Sehr seltsam...ich konnte auch keinen Unterschied mehr finden...deswegen die Frage an euch..😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
FoxMulder schrieb: P.S.: Wenn ihr das Script zur Analyse braucht sagt bescheid. 😉
Bescheid. robert
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
ok...poste ich heute Abend...bin gerade auf Arbeit..😉
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
So hier wie versprochen ein Script wo der Fehler auftritt. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | #!/bin/bash
date=`date +%Y.%m.%d`
### Einlesen der Artikelnummern
cat /home/fox/a4e-scripte/roega/roegaartikel.txt | while read SKU ; do
### Auslesen des Status aus der CSV
status="$( cat /home/fox/a4e-scripte/roega/ART_$date.csv | grep -m 1 $SKU | sed 's/;/ /g;' | awk '{print $2}' | sed 's/.0/ /g;' )"
time="$(
if [[ "$status" =~ "0" ]] ; then echo "7"
else echo "2"; fi )"
### Addon fuer den Eintrag in die DB
mysql -udbuser -p'DB-PW' -Ddb-name -e "UPDATE j25_jshopping_products SET delivery_times_id=$time WHERE product_ean='$SKU' LIMIT 1;"
sleep 2
done
### Addon fuer den Mailversand
SUBJECT="ROEGA Lieferstatus Update erstellt"
TO="info@localhost"
MESSAGE="/home/fox/tmp/roega_message.txt"
echo "Der Lieferstatus wurde aktualisiert." >> $MESSAGE
echo "Lieferant: ROEGA" >> $MESSAGE
echo "Time: `date`" >> $MESSAGE
echo "Bitte prüfen ob Lieferzeit korrekt eingetragen wurde." >> $MESSAGE
echo "Stichproben SKU: " >> $MESSAGE
/usr/bin/mail -s "$SUBJECT" "$TO" < $MESSAGE
rm $MESSAGE
|
Also hier wird aus der "roegaartikel.txt" die Artikelnummer ausgelesen. Diese stehen in einer Spalte untereinander. Dann wird der Lieferstatus aus der CSV ausgelesen. Die CSV besteht aus 2 Spalten (Artikelnr. + Lieferstatus). Als Ausgabe bleibt nur noch der Lieferstatus übrig und wird dann mit dem Ergebnis in die DB zur jeweiligen Artikelnummer geschrieben. Die Werte 7 & 2 sind die IDs für den Lieferstatus der im Shop angezeigt wird. Das ganze funzt soweit auch recht gut...bis auf diese Meldungen die nach dem Script kommen. :-/
Alle Artikel sind auch in der CSV vorhanden..das habe ich geprüft. Änhnlich mache ich das auch mit anderen Lieferanten die z.b. keine Datei für den Lieferstatus liefern. Da frage ich die Webseite der Lieferanten ab und parse den Lieferstatus...funzt soweit auch gut. Das Script habe ich mit Hilfe hier aus dem Forum erstellt! 😉 Danke für eure Hilfe und viele Grüße
Fox
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Bei welchem Teil des Skripts bekommst Du den Fehler ? (eine "broken pipe" heißt ja immer, dass eine der Komponenten in einer Pipe in dem Moment nicht (mehr) da ist) Mir fällt auf, dass Du viele Sachen unnötig kompliziert machst. Z.B. würde ich Dir den Mailversand so vorschlagen: | ### Addon fuer den Mailversand
subject="ROEGA Lieferstatus Update erstellt"
to="info@localhost"
date "+Der Lieferstatus wurde aktualisiert.
Lieferant: ROEGA
Time: %c
Bitte prüfen ob Lieferzeit korrekt eingetragen wurde.
Stichproben SKU: " | /usr/bin/mail -s "$subject" "$to"
|
- fertig. - Keine temporäre Datei nötig. (beachte bitte; eigene Variablen besser $klein, dann gibt es keine Konflikte mit Systemvariablen, die sind nämlich immer $GROSS) In der Art lässt sich fast jeder Block kürzer, schneller und übersichtlicher schreiben. Dann fällt mir das sleep in der Schleife auf: wofür das ? könnte es ein pfuschen sein, das nicht immer funktioniert ? (Du solltest den Schleifenteil einrücken, so ist das schwierig zu erkennen !) Womöglich kommt die Meldung auch von der Zeile 6, wenn die while-Schleife vorzeitig abbricht. Probier mal die Zeilen 6 und 21 durch dies zu ersetzen: while read SKU ; do
....
done < /home/fox/a4e-scripte/roega/roegaartikel.txt (useless use of cat) LG, track
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
Danke dir für die vielen Tipps und Änderungen! Diese werde ich alle mal einbauen...☺ Bei welchem Teil der Fehler auftritt kann ich leider nicht sagen, da die Meldung anscheind nur kommt wenn ich das Script über den Cronjob starten lasse....
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
FoxMulder schrieb: ... da die Meldung anscheind nur kommt wenn ich das Script über den Cronjob starten lasse.
Ah, das ist ein ganz neuer Aspekt ! (hattest Du noch gar nicht verraten ...) Das spricht dafür, dass irgend ein Pfad nicht stimmt. (mangels gesetzter Umgebungsvariablen) Probier mal bitte folgendes aus:
Füge set -x am Anfang Deines Skripts ein (dann zeigt er was er genau macht) Starte Dein Skript ohne Umgebung:
Dann sehen wir mal ... track
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
so ich hab eben mal ein Script so gestartet....rennt derzeit mal durch....aber noch keine Auffälligkeiten. | ++ cat /home/fox/a4e-scripte/roega/ART_2012.12.08.csv
++ grep -m 1 YT-90108
++ sed 's/;/ /g;'
++ awk '{print $2}'
++ sed 's/.0/ /g;'
+ status='1 '
++ [[ 1 =~ 0 ]]
++ echo 2
+ time=2
+ mysql -uxxx '-pxxxxx' -Ddb-xxxx -e 'UPDATE j25_jshopping_products SET delivery_times_id=2 WHERE product_ean='\''YT-90108'\'' LIMIT 1;'
+ sleep 2
|
// Script ist vollständig durch gelaufen....hat keine Fehler gebracht...:-/ //Edit2:
Ich habe nun mal wie von dir vorgeschlagen die " while-Schleife " geändert. Das Script funzt damit auch noch. 😉 Ich teste es damit diese Nacht (da läuft der Cron) mal...mal sehen ob es was bringt. 😉
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
leider haben die Änderungen nichts gebracht... die Fehler mail kam heute wieder vom cron... :-\
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
FoxMulder schrieb: leider haben die Änderungen nichts gebracht... die Fehler mail kam heute wieder vom cron... :-\
Hast Du denn das Skript mit 'set -x' ausführen lassen? Was hat Dir cron als Ausgabe zugemailt? Es ist schwer, das zu debuggen, wenn man nicht alle Infos zusammen hat. Ciao robert PS: Du bekommst übrigens zwei Useless Cat Awards für das Skript. 😉
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
So habs nun mal im Cron auch mal mit "set -x" laufen lassen....Ergebnis war ne Mail und auch diesmal mit Fehlern...😉
Hier nen Auszug wo der Fehler auftrat: 1
2
3
4
5
6
7
8
9
10
11
12
13 | + read SKU
++ cat /home/fox/a4e-scripte/roega/ART_2012.12.10.csv
++ grep -m 1 092405
++ sed 's/;/ /g;'
++ awk '{print $2}'
++ sed 's/.0/ /g;'
cat: write error: Broken pipe
+ status='5 '
++ [[ 5 =~ 0 ]]
++ echo 2
+ time=2
+ mysql -uxxxx '-pxxxx' -Ddb-xxxx -e 'UPDATE j25_jshopping_products SET delivery_times_id=2 WHERE product_ean='\''092405'\'' LIMIT 1;'
+ sleep 2
|
Ich kann bei dieser Artikelnummer jedoch keinen Unterschied zu den anderen feststellen...auch in der CSV sieht alles wie bei den anderen aus..:-/ Die "Useless Cat Awards" nehme ich gern an...😉 Hab das Script aber zusammen mit Leuten hier aus dem Forum gebaut...😉 Danke euch für eure Hilfe!!!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
FoxMulder schrieb: So habs nun mal im Cron auch mal mit "set -x" laufen lassen....Ergebnis war ne Mail und auch diesmal mit Fehlern...😉
Hier nen Auszug wo der Fehler auftrat: 1
2
3
4
5
6
7
8
9
10
11
12
13 | + read SKU
++ cat /home/fox/a4e-scripte/roega/ART_2012.12.10.csv
++ grep -m 1 092405
++ sed 's/;/ /g;'
++ awk '{print $2}'
++ sed 's/.0/ /g;'
cat: write error: Broken pipe
+ status='5 '
++ [[ 5 =~ 0 ]]
++ echo 2
+ time=2
+ mysql -uxxxx '-pxxxx' -Ddb-xxxx -e 'UPDATE j25_jshopping_products SET delivery_times_id=2 WHERE product_ean='\''092405'\'' LIMIT 1;'
+ sleep 2
|
Ich kann bei dieser Artikelnummer jedoch keinen Unterschied zu den anderen feststellen...auch in der CSV sieht alles wie bei den anderen aus..:-/ Die "Useless Cat Awards" nehme ich gern an...😉 Hab das Script aber zusammen mit Leuten hier aus dem Forum gebaut...😉
Siehst Du, da haben wir den Übeltäter schon: Du benutzt grep mit "-m 1", so dass der grep terminiert, sobald er die erste Fundstelle hat. Ohne cat wäre das nicht passiert! Also, erster Schritt: | status="$( grep -m 1 $SKU /home/fox/a4e-scripte/roega/ART_$date.csv | sed 's/;/ /g' | awk '{print $2}' | sed 's/.0/ /g' )"
|
Den ersten sed können wir uns sparen, da Du den ja nur benutzt, um ein Feld zu extrahieren. | status="$( grep -m 1 $SKU /home/fox/a4e-scripte/roega/ART_$date.csv | awk -F ';' '{print $2}' | sed 's/.0/ /g' )"
|
Jetzt integrieren wir den grep noch in awk : | status="$( awk -F ';' "/$SKU/"' {print $2; exit}' /home/fox/a4e-scripte/roega/ART_$date.csv | sed 's/.0/ /g' )"
|
Und dann auch noch den zweien sed : | status="$( awk -F ';' "/$SKU/"' {gsub(/.0/, " ", $2); print $2; exit}' /home/fox/a4e-scripte/roega/ART_$date.csv )"
|
Willst Du wirklich alle Kombinationen aus einem beliebigen Zeichen und 0 durch ein Leerzeichen ersetzen? Willst Du vielleicht nicht eher ".0" (Punkt Null) durch ein Leerzeichen oder sogar gar nichts ersetzen? Dann müsste es so aussehen: | status="$( awk -F ';' "/$SKU/"' {gsub(/\.0/, "", $2); print $2; exit}' /home/fox/a4e-scripte/roega/ART_$date.csv )"
|
Oder sogar so, wenn Du beliebig viele Nullen loswerden willst: | status="$( awk -F ';' "/$SKU/"' {gsub(/\.0+/, "", $2); print $2; exit}' /home/fox/a4e-scripte/roega/ART_$date.csv )"
|
Ciao robert
|
FoxMulder
(Themenstarter)
Anmeldungsdatum: 23. April 2007
Beiträge: 105
|
Das ist ja cooool!!! ☺
Hätte nicht gedacht das man das alles NUR mit awk machen kann..☺ (hätte wohl doch was anderes lernen sollen ^^) Das Ergebnis ist jedenfalls das gleiche...das find ich cool! Ich hab das Script nun mal deinen Angaben nach umgestellt und den Cron umgestellt sodass er gleich mal startet...ich bin gespannt! Die Quell-CSV ist so aufgebaut:
107A40582;0.0 Die erste Spalte ist die Artikelnummer und die zweite der Lieferstand. Dieser ist mal 0.0 und mal 99.0 oder 10.0 (je nach Lagermenge). Da dieses .0 jedoch nicht interessiert muss ich das halt wegschneiden. Danke dir vielmals für deine Hilfe! Ich gebe Rückmeldung wenn der Cron gelaufen ist. 😉 LG
Fox Bearbeitet von rklm: Formatierung der CSV-Zeile
|