εκτέλεση process με timeout
Giorgos Keramidas
keramida at ceid.upatras.gr
Thu Jun 8 00:45:18 EEST 2006
Προφανώς το mailman έφαγε το προηγούμενο reply, οπότε το στέλνω χωρίς
attachment:
On 2006-06-07 19:29, Nick Demou <ndemou at gmail.com> wrote:
> τρέχω περιοδικά το fetchmail σε ένα script. Όλα πηγαίνανε καλά
> αλλά σήμερα για πρώτη φορά μετά από 2-3 μήνες το fetchmail
> κόλησε και συνεπώς και όλο το script. Με kill τερματίστηκε και
> όλα σηνέχισαν κανονικά αλλά θα θελα να κάνω το script πιο
> ανθεκτικό σε τέτοιες περιπτώσεις.
>
> Σκέφτηκα ότι θα υπάρχει κάποιο τρικ για να καλό ένα
> προγραμματάκι (το fetchmail στην περίπτωση μου) και ταυτρόχρονα
> να έχω ένα time out (π.χ. 1 ώρα) που αν ξεπεραστεί να σκοτώνω
> το process με το ζόρι και να στέλνω και email σε εμένα για
> γνωστοποίηση
>
> καμιά ιδέα?
>
> σε μια φανταστική γλώσσα που υπάρχει μόνο στο μυαλό μου
> σκέφτηκα κάτι σαν το παρακάτω :
>
> ( fetchmail ; echo "done" > done.tmp ) &
> minutes=0
> DO WHILE NOT( file "done.tmp" exists ) AND minutes<60
> sleep 60
> counter = counter + 1
> LOOP
> kill PID(fetchmail που ξεκίνησα παραπάνω)
Ειδικά με το fetchmail, μπορείς να χρησιμοποιήσεις το -d option.
Γενικότερα, με προγράμματα που δεν υποστηρίζουν τα ίδια κάποιο timeout
μηχανισμό, μπορείς να χρησιμοποιήσεις το πρόγραμμα:
http://people.FreeBSD.org/~keramida/timeout.tgz
Το checksum του αρχείου θα πρέπει να είναι:
$ for a in sha md5 ; do openssl dgst -"$a" timeout.tgz ; done
SHA(timeout.tgz)= d35b463a0ff22ae4cda541768a587c3b31179b5d
MD5(timeout.tgz)= 67d37fb6d2aa557c01b40e32f8c5ab3f
$
Δεν έκατσα να γράψω και manpage, αλλά θα καταλάβεις πιστεύω πως
δουλεύει:
timeout [-v] -t seconds cmd [args]
Η παράμετρος -t είναι υποχρεωτική, αλλά αν δε θες να κάνει ποτέ
timeout το `cmd' πέρνα 0 ως τον αριθμό των δευτερολέπτων, όπως
φαίνεται και παρακάτω:
$ time ./timeout -t1 sleep 5
real 0m1.008s
user 0m0.003s
sys 0m0.005s
$ time ./timeout -t0 sleep 5
real 0m5.007s
user 0m0.002s
sys 0m0.011s
Επειδή ακριβώς το `timeout' κάνει polling, δεν είναι 100% ακριβές
στον χρόνο (όπως βλέπεις και παραπάνω περιμένει μερικά χιλιοστά
του χρόνου περισσότερο), αλλά βαρέθηκα να το κάνω να τερματίζει
απευθείας μέσα από το signal handler του SIGALRM.
Αν κάνεις κάποια σχετική βελτίωση και θες να τη μοιραστείς,
ξέρεις το email μου :-)
Με 'γεια :)
- Γιώργος
More information about the Linux-greek-users
mailing list