Server timeout σε python script

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Server timeout σε python script

Δημοσίευσηαπό mechpanos » 30 Νοέμ 2015, 16:50

Χαιρετώ τους προγραμματιστές του forum!
Έχω φτιάξει ένα σκριπτάκι, που συνδέεται σε έναν web server και τσεκάρει με scrapping, κάποιες τιμές (το λέω όσο πιο απλά μπορώ).
Αυτό γίνεται επαναλαμβανόμενα, θεωρητικά 24 ώρες το 24ωρο, κάθε 5 λεπτά.
Το πρόβλημά μου είναι, ότι ορισμένες φορές δεν αποκρίνεται ο server και το σκριπτ κολλάει. Όταν το κάνει αυτό στην φάση την επικοινωνίας με το server, τότε έχω βάλει να μην κολλάει στο error και να πηγαίνει παρακάτω.
Κώδικας: Επιλογή όλων
try:  #vazoume to try - except:pass gia na mhn kollaei to programma an xathei h syndesh   
     htmlfile = urllib.urlopen("http://192.168.1............html") #edw katevazei to arxeio html twn timwn
    except:
        pass

Όταν όμως ο server αποκρίνεται αλλά αργεί πολύ με αποτέλεσμα να κάνει ο ίδιος ο server timeout, το script δεν το καταλαβαίνει και περιμένει να λάβει τιμές, τις οποίες δεν λαμβάνει προφανώς ποτέ, οπότε μένει κολλημένο σε αυτό το σημείο.
Οπότε, θα ήθελα να μάθω, αν μπορώ να βάλω ένα timeout σε μια επανάληψη, ώστε, αν δεν ολοκληρωθεί το loop πχ μέσα σε 1 λεπτό, να ξεκινάει από την αρχή.
Νομίζω ότι αυτό θα έλυνε τα κολλήματα.
Πύργος θεός Πανηλειακός !!!

Στα...δικά μας τώρα:
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Λίγο Python, Fortran ┃ Αγγλικών: Lower
2 Ubuntu 14.04 trusty 3.13.0-36-generic 32bit
3 Intel Core2 CPU T7200 2.00GHz ‖ RAM 2006 MiB ‖ AMILO Pi 1505
4 Intel Mobile 945GM/GMS, 943/940GML Express Integrated [8086:27a2] {i915}
5 wlan0: 0bda:8179 Realtek ⋮ eth0: Realtek RTL-8139/8139C/8139C+ [10ec:8139] (rev 10)

Γραφείο:
2 Ubuntu 16.04 xenial 4.4.0-71-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 Intel Q6600 2.40GHz ‖ RAM 3950 MiB ‖ Gigabyte P41T-D3P
4[AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series]
Άβαταρ μέλους
mechpanos
babeTUX
babeTUX
 
Δημοσιεύσεις: 86
Εγγραφή: 06 Ιουν 2011, 11:44
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό kamar » 02 Δεκ 2015, 20:06

Υποθέτω ότι χρησιμοποιείς Python 2.7.x. Χρησιμοποιώντας τη βιβλιοθήκη urllib2 έχει μια παράμετρο timeout, που μπορείς να τη χρησιμοποιήσεις.
Ο κώδικας θα είναι κάπως έτσι:

Κώδικας: Επιλογή όλων
from socket import timeout

try:
    htmlfile = urllib2.urlopen('http://kai/ta/loipa', timeout=10)
except timeout:
    # Ο χειρισμός του timeout.
except:
    #Χειρισμός άλλων σφαλμάτων.
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 14.04 trusty 3.13.0-91-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD A6-5400K APU with Radeon HD Graphics ‖ RAM 3347 MiB ‖ ASUS F2A55-M LK2 PLUS
4 Advanced Micro Devices, Inc. [AMD/ATI] Trinity [Radeon HD 7540D] [1002:9991] {radeon}
5 eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09)
Άβαταρ μέλους
kamar
punkTUX
punkTUX
 
Δημοσιεύσεις: 166
Εγγραφή: 10 Μάιος 2008, 20:24
Τοποθεσία: Χανιά
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό mechpanos » 03 Δεκ 2015, 10:50

Καλημέρα Kamar!
Θα το δοκιμάσω!
Αυτό που σκέφτομαι, είναι τι χειρισμό να βάλω στο timeout...Να βάλω και εκεί pass?
Πύργος θεός Πανηλειακός !!!

Στα...δικά μας τώρα:
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Λίγο Python, Fortran ┃ Αγγλικών: Lower
2 Ubuntu 14.04 trusty 3.13.0-36-generic 32bit
3 Intel Core2 CPU T7200 2.00GHz ‖ RAM 2006 MiB ‖ AMILO Pi 1505
4 Intel Mobile 945GM/GMS, 943/940GML Express Integrated [8086:27a2] {i915}
5 wlan0: 0bda:8179 Realtek ⋮ eth0: Realtek RTL-8139/8139C/8139C+ [10ec:8139] (rev 10)

Γραφείο:
2 Ubuntu 16.04 xenial 4.4.0-71-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 Intel Q6600 2.40GHz ‖ RAM 3950 MiB ‖ Gigabyte P41T-D3P
4[AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series]
Άβαταρ μέλους
mechpanos
babeTUX
babeTUX
 
Δημοσιεύσεις: 86
Εγγραφή: 06 Ιουν 2011, 11:44
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό kamar » 04 Δεκ 2015, 19:26

mechpanos έγραψε:Καλημέρα Kamar!
Θα το δοκιμάσω!
Αυτό που σκέφτομαι, είναι τι χειρισμό να βάλω στο timeout...Να βάλω και εκεί pass?


Το pass, δεν ενδείκνυται, γιατί περνάει το σφάλμα στο φτερό.
Η καλύτερη λύση είναι να τυπώνει ή να κάνει log σε κάποιο αρχείο, ένα μήνυμα και, να γίνεται κανονική έξοδος.


Edit
Γράψε αν η λύση που σου έδωσα, δούλεψε.
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 14.04 trusty 3.13.0-91-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD A6-5400K APU with Radeon HD Graphics ‖ RAM 3347 MiB ‖ ASUS F2A55-M LK2 PLUS
4 Advanced Micro Devices, Inc. [AMD/ATI] Trinity [Radeon HD 7540D] [1002:9991] {radeon}
5 eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09)
Άβαταρ μέλους
kamar
punkTUX
punkTUX
 
Δημοσιεύσεις: 166
Εγγραφή: 10 Μάιος 2008, 20:24
Τοποθεσία: Χανιά
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό mechpanos » 09 Δεκ 2015, 11:00

Καλημέρα φίλε μου καλέ kamar...Πες μου πρώτα πρώτα, που θα σε βρω να σε κεράσω μια μπίρα!!!
:clap:
Η λύση δούλεψε, εδώ και 5 μέρες το σκριπτάκι δεν έχει κολλήσει καθόλου (Το έφτιαξα Παρασκευή, από τότε τρέχει κομπλέ). Γι' αυτό μπήκα βασικά σήμερα στο forum, για να γράψω ότι πέτυχε!
Επειδή δεν είμαι από πάνω, δεν έχω πετύχει τι κάνει αν κολλήσει ο web server, αλλά λογικά το timeout πιάνει και συνεχίζει το σκριπτ, όπου πιο κάτω του έχω δώσει να περιμένει 5 λεπτά και να εκτελέσει την ανάγνωση από την αρχή.
Επειδή δεν γνωρίζω και καλά τα προγραμματιστικά και ειδικά την python, απλά έμαθα να γράφω λίγες γραμμές και με λίγο (πολύ, χε χε) copy paste να κάνω τη δουλειά που θέλω, έχω αφήσει το pass γιατί δεν με νοιάζει και τόσο να δω το συγκεκριμένο error από που προέρχεται (έτσι κι αλλιώς το ξέρω, ή network error θα είναι ή server timeout, τι άλλο!), αφετέρου με νοιάζει το σκριπτ να προσπεράσει το error και να δοκιμάσει από την αρχή να διαβάσει τις τιμές από τον Server, γι αυτό με έχει εξυπηρετήσει το pass.

Να σου δώσω να καταλάβεις, αυτό που κάνω είναι να διαβάζω τις τιμές από την τηλεμετρία κάτι φωτοβολταϊκών, όπου κάποια inverter κατά καιρούς μπλοκάρουν.
Κανονικά, η τηλεμετρία έχει ενσωματωμένο σύστημα ειδοποιήσεων, που στέλνει email όταν υπάρξει κάποιο σφάλμα. Όμως, είναι λίγο buggy και στέλνει άλλα αντί άλλων (πχ θα έρθει mail ότι υπάρχει σφάλμα, αλλά θα λέει λάθος inverter). Με το σκριπτ εγώ λοιπόν, μπαίνω στον web server της τηλεμετρίας, διαβάζω καταρχήν τις ενδείξεις των οργάνων, και αν η ηλιοφάνεια είναι μεγαλύτερη από κάποια τιμή (δηλαδή, δεν είναι νύχτα!), και αν κάποιο ινβέρτερ μου δείχνει μηδενική ισχύ, στέλνω email ότι βρέθηκε ινβέρτερ σβηστό και ποιο είναι, ώστε να ειδοποιήσω κάποιον να πάει να το ξεμπλοκάρει.
Αν ξεμπλοκαριστούν όλα, στέλνω email ότι η ορθή λειτουργία αποκαταστάθηκε.
Στο τέλος της ημέρας, στέλνω και ένα email με το πόση ήταν η ημερήσια παραγωγή. Θα μπορούσε να εμπλουτισθεί και με χιλιάδες παραμέτρους, πχ ανάλογα με το πόση είναι η ηλιοφάνεια και πόση είναι η ισχύς να στέλνει ειδοποίηση αν παρατηρείται μείωση της απόδοσης, αλλά είπαμε μην το μπίιπ κιόλας :).
Αυτό γίνεται ξανά, και ξανά, και ξανά...

Ένας λόγος που το έκανα σε python είναι, ότι θα μπορούσε χωρίς καμία τροποποίηση, να τρέξει σε ένα Raspberry...Επιπλέον, θα μπορούσε το raspberry μέσω των gpio να ενεργοποιεί κάποια ρελέ, να σβήνουν τελείως το inverter και να το ξανανοίγουν μετά από λίγο, ώστε να μην χρειάζεται καν να πάει εκεί τεχνικός. Αλλά τα ρελέ αυτά κάνουν κάποια δεκάδες € και χρειάζομαι καμιά 200ριά τέτοια, οπότε προς το παρόν βολεύομαι με το να πηγαίνω εγώ, ή να ειδοποιώ κάποιον που είναι στον χώρο, να κάνει την διαδικασία manually.

Ορίστε, αποκάλυψα και την λειτουργία!...

Καλημέρα!
Πύργος θεός Πανηλειακός !!!

Στα...δικά μας τώρα:
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Λίγο Python, Fortran ┃ Αγγλικών: Lower
2 Ubuntu 14.04 trusty 3.13.0-36-generic 32bit
3 Intel Core2 CPU T7200 2.00GHz ‖ RAM 2006 MiB ‖ AMILO Pi 1505
4 Intel Mobile 945GM/GMS, 943/940GML Express Integrated [8086:27a2] {i915}
5 wlan0: 0bda:8179 Realtek ⋮ eth0: Realtek RTL-8139/8139C/8139C+ [10ec:8139] (rev 10)

Γραφείο:
2 Ubuntu 16.04 xenial 4.4.0-71-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 Intel Q6600 2.40GHz ‖ RAM 3950 MiB ‖ Gigabyte P41T-D3P
4[AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series]
Άβαταρ μέλους
mechpanos
babeTUX
babeTUX
 
Δημοσιεύσεις: 86
Εγγραφή: 06 Ιουν 2011, 11:44
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό the_eye » 09 Δεκ 2015, 18:53

Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα. Με τον τρόπο αυτό βοηθάμε κάποιον να βρει εύκολα τη λύση σε παρόμοιο θέμα απλά πατώντας πάνω στο πράσινο τικ.

Όσο λιγότερο κλειστό λογισμικό έχεις, τόσα λιγότερα προβλήματα.
1 Γνώσεις ⇛ Linux: Καλό ┃ Προγραμματισμός: Ναι PHP, MySQL ┃ Αγγλικά: Καλά
2 Ubuntu 18.04 bionic 4.15.0-42-generic 64bit (el_GR.UTF-8, GNOME-Flashback:Unity gnome-flashback-compiz)
3 Intel Core i3-6100 CPU @ 3.70GHz ‖ RAM 3832 MiB ‖ Gigabyte B150M-HD3 DDR3-CF
4 Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
5 enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
Οδηγοί Ubuntu Βίντεο Οδηγοί
Άβαταρ μέλους
the_eye
Διαχειριστής
Διαχειριστής
 
Δημοσιεύσεις: 11450
Εγγραφή: 16 Μαρ 2010, 17:19
Launchpad: ntoulasd
IRC: the_eye_
Εκτύπωση

Re: Server timeout σε python script

Δημοσίευσηαπό mechpanos » 10 Δεκ 2015, 10:15

Καλημέρα και πάλι!
Ενώ είχε δουλέψει 5-6 μέρες χωρίς κόλλημα, χθες μου κόλλησε, βγάζοντας το παρακάτω σφάλμα:
Traceback (most recent call last):
File "monitor2.py", line 92, in <module>
htmlfile = urllib2.urlopen("http://192.168.1.50/html/en/onlineOverWr.html", timeout=10)
File "/usr/lib/python2.7/socket.py", line 351, in read
data = self._sock.recv(rbufsize)
File "/usr/lib/python2.7/httplib.py", line 573, in read
s = self.fp.read(amt)
File "/usr/lib/python2.7/socket.py", line 380, in read
data = self._sock.recv(left)
socket.timeout: timed out

Το θέμα είναι, ότι η γραμμή που λέει (92), είναι μέσα σε μια δομή ως εξής:
try:
htmlfile = urllib2.urlopen("http://192.168.1.50/html/en/onlineOverWr.html", timeout=10)
except timeout:
pass
except:
pass

Δηλαδή, κανονικά, δεν θα έπρεπε καν να μου βγάλει το σφάλμα, αλλά να προχωρήσει εκτελώντας την επανάληψη από την αρχή. Πώς γένιν ατό;
Πύργος θεός Πανηλειακός !!!

Στα...δικά μας τώρα:
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Λίγο Python, Fortran ┃ Αγγλικών: Lower
2 Ubuntu 14.04 trusty 3.13.0-36-generic 32bit
3 Intel Core2 CPU T7200 2.00GHz ‖ RAM 2006 MiB ‖ AMILO Pi 1505
4 Intel Mobile 945GM/GMS, 943/940GML Express Integrated [8086:27a2] {i915}
5 wlan0: 0bda:8179 Realtek ⋮ eth0: Realtek RTL-8139/8139C/8139C+ [10ec:8139] (rev 10)

Γραφείο:
2 Ubuntu 16.04 xenial 4.4.0-71-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 Intel Q6600 2.40GHz ‖ RAM 3950 MiB ‖ Gigabyte P41T-D3P
4[AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series]
Άβαταρ μέλους
mechpanos
babeTUX
babeTUX
 
Δημοσιεύσεις: 86
Εγγραφή: 06 Ιουν 2011, 11:44
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι