Θέλω να επαληθεύσω αν μια συγκεκριμένη crontab λειτουργεί σωστά. Έχω προσθέσει μια εργασία ως εξής:
*/2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1
Ξέρω ότι ανακατευθύνω στη συσκευή null, αλλά δεν είμαι σίγουρος αν η παραπάνω εντολή είναι καλή.
*Επεξεργασία 1: Στο /var/log/syslog μου κάθε δύο λεπτά έχω το ακόλουθο σφάλμα:
(CRON) error (grandchild #2788 failed with exit status 2)
*Επεξεργασία 2: Δεν υπάρχουν σφάλματα στα αρχεία καταγραφής με αυτή τη νέα εργασία:
*/2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1
Η σύνταξη της καταχώρησης crontab φαίνεται σωστή. Πράγματι, αν επεξεργαστείτε την crontab σας χρησιμοποιώντας το "crontab -e
" (όπως θα έπρεπε), θα λάβετε ένα σφάλμα αν ορίσετε μια συντακτικά μη έγκυρη καταχώρηση crontab ούτως ή άλλως.
Πρώτον, το /path_to_my_php_script/info.php
εκτελείται σωστά από τη γραμμή εντολών;
Αν ναι, εκτελείται επίσης σωστά με τον ακόλουθο τρόπο;:
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)",
Αν αυτό λειτουργεί, λειτουργεί έτσι;
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)",
Το βήμα (3) είναι παρόμοιο με τον τρόπο με τον οποίο το cron θα εκτελέσει το πρόγραμμά σας (όπως τεκμηριώνεται στο "man 5 cron".
Το πιο πιθανό πρόβλημα που αντιμετωπίζετε είναι ότι το PATH που χρησιμοποιεί το cron για να εκτελέσει το πρόγραμμά σας είναι πολύ περιοριστικό. Ως εκ τούτου, ίσως θελήσετε να προσθέσετε κάτι σαν το παρακάτω στην κορυφή της εγγραφής crontab (θα πρέπει να προσθέσετε σε όποιους καταλόγους θα χρειαστεί το σενάριό σας):
PATH=~/bin:/usr/bin/:/bin
Σημειώστε επίσης ότι το cron θα χρησιμοποιήσει από προεπιλογή το /bin/sh
, όχι το bash. Αν χρειάζεστε bash, προσθέστε επίσης αυτό στην αρχή του αρχείου crontab σας:
SHELL=/bin/bash
Σημειώστε ότι και οι δύο αυτές αλλαγές θα επηρεάσουν όλες τις καταχωρήσεις crontab. Αν θέλετε απλώς να τροποποιήσετε αυτές τις τιμές για το πρόγραμμα info.php
σας, μπορείτε να κάνετε κάτι τέτοιο:
*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"
Αξίζει επίσης να αναφέρουμε ότι σε ένα σύστημα που έχει ρυθμιστεί για "mail" (με άλλα λόγια ένα σύστημα που έχει ρυθμιστεί ένα MTA [sendmail/postfix/κλπ]), όλα τα αποτελέσματα από τα προγράμματα crontab σας αποστέλλονται αυτόματα μέσω email. Ένα προεπιλεγμένο επιτραπέζιο σύστημα Ubuntu δεν θα'εχει διαμορφωμένο τοπικό ταχυδρομείο, αλλά αν εργάζεστε σε διακομιστή μπορείτε απλά να πληκτρολογήσετε "mail" σε ένα τερματικό για να δείτε όλα αυτά τα cron mails. Αυτό ισχύει επίσης για την εντολή "at
".
Μην ανακατευθύνετε την έξοδο σφαλμάτων στο /dev/null και grep /var/log/syslog για την έξοδο cron.
grep cron /var/log/syslog
Μπορείτε να εμφανίσετε αμέσως τα σφάλματα κατά την αποθήκευση ενός αρχείου μετά την επεξεργασία του /etc/crontab
ή των αρχείων μέσα στο /etc/cron.d/
με:
tail -f /var/log/syslog | grep --line-buffered cron
Αν η επεξεργασία είναι εντάξει, θα δείτε μόνο την ειδοποίηση RELOAD
, τα σφάλματα θα εμφανιστούν όπως
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new
Μπορείτε να δείτε το ενεργό cron με την εντολή terminal:
crontab -l
Εδώ είναι οι παράμετροι με τη σειρά:
min (0 - 59)
ώρα (0 - 23)
ημέρα του μήνα (1 - 31)
μήνας (1 - 12)
Ημέρα της εβδομάδας (0 - 6) (Κυριακή=0)
Έτσι, καλείτε το σενάριό σας κάθε πρώτο λεπτό κάθε ώρας. Θα πρέπει να ελέγχετε την έξοδό σας σε πιο συχνά διαστήματα για σκοπούς δοκιμών:
* * * * * <command> #Runs every minute
Αυτό θα το καλεί κάθε λεπτό!