εκτέλεση 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