שאלה למה crontab שלי לא עובד, ואיך אני יכול לפתור את זה?


זה קנוניקל שאלה על השימוש cron & crontab.

אתה כבר מכוונת כאן כי הקהילה היא די בטוח כי התשובה לשאלה שלך ניתן למצוא להלן. אם השאלה שלך לא נענתה למטה, התשובות יעזרו לך לאסוף מידע שיעזור לקהילה לעזור לך. יש לערוך את המידע הזה לשאלה המקורית שלך.

התשובה 'למה crontab שלי לא עובד, ואיך אני יכול לפתור את זה?"אפשר לראות למטה. זה מתייחס cron מערכת עם crontab מודגש.


193
2017-11-17 04:51




זוהי אדרת ענקית הסיבות לכך crontab לא עובד על AskUbuntu. - Dan Dascalescu


תשובות:


כיצד לתקן את כל הבעיות הקשורות crontab שלך / בעיות (Linux)


זה ויקי קהילה, אם אתה מבחין במשהו שגוי עם תשובה זו או אם יש לך מידע נוסף, אנא ערוך אותה.


ראשית, מונחים בסיסיים:

  • cron (8) הוא הדמון שמבצע פקודות מתוזמנות.
  • crontab (1) היא תוכנית המשמשת לשנות את המשתמש crontab (5) קבצים.
  • crontab (5) הוא לכל קובץ משתמש המכיל הוראות עבור cron (8).

לאחר מכן, חינוך על cron:

כל משתמש במערכת יכול להיות קובץ crontab שלהם. המיקום של השורש ואת הקבצים crontab המשתמש הם מערכת תלויים אבל הם בדרך כלל מתחת /var/spool/cron.

יש מערכת רחבה /etc/crontab בקובץ, /etc/cron.d הספרייה עשויה להכיל קטעי crontab אשר נקראים גם פעולה על ידי cron. כמה הפצות לינוקס (למשל, Red Hat) יש גם /etc/cron.{hourly,daily,weekly,monthly} אשר הם ספריות, סקריפטים בתוך אשר יבוצע כל שעה / יום / שבוע / חודש, עם זכות השורש.

שורש יכול תמיד להשתמש בפקודה crontab; משתמשים רגילים עשויים לקבל גישה או לא. כאשר אתה עורך את הקובץ crontab עם הפקודה crontab -e ולשמור אותו, crond בודק את זה עבור תוקף בסיסי, אבל אינו מבטיח קובץ crontab שלך נוצר כראוי. יש קובץ שנקרא cron.deny אשר יפרט אילו משתמשים לא יכולים להשתמש cron. ה cron.deny מיקום הקובץ תלוי במערכת וניתן למחוק אותו אשר יאפשר לכל המשתמשים להשתמש cron.

אם המחשב אינו מופעל או daemon crond אינו פועל, והתאריך / שעה עבור פקודה להפעלה עבר, crond לא תתפוס ותפעיל שאילתות קודמות.

crontab הפרטים, איך לנסח פקודה:

הפקודה crontab מיוצגת על ידי שורה אחת. אתה לא יכול להשתמש \ כדי להרחיב פקודה על מספר שורות. חשיש (#) סימן מייצג תגובה שמשמעותה דבר על הקו הזה הוא התעלם על ידי cron. חללים מובילים וקווים ריקים מתעלמים.

היזהר מאוד בעת שימוש באחוזים (%) לחתום על הפקודה שלך. אלא אם כן הם נמלטו \% הם מומרים newlines והכל לאחר הראשון לא ברח % הוא עבר את הפקודה על stdin.

ישנם שני פורמטים עבור קבצים crontab:

  • משתמש crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • מערכת רחבה /etc/crontab ו /etc/cron.d רסיסים

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

שים לב כי האחרון דורש שם משתמש. הפקודה תפעל כמשתמש בעל שם.

5 השדות הראשונים של הקו מייצגים את הזמן (ים) כאשר הפקודה צריכה להיות מופעלת. ניתן להשתמש במספרים או במקומות המתאימים ליום / חודש במפרט הזמן.

  • השדות מופרדים על ידי רווחים או כרטיסיות.
  • פסיק (,) משמש לציון רשימה כגון 1,4,6,8 כלומר לרוץ ב 1,4,6,8.
  • טווחים מסומנים עם מקף (-) ויכול להיות משולב עם רשימות לדוגמה. 1-3,9-12 כלומר בין 1 ל 3 ואז בין 9 ל 12.
  • ה / ניתן להשתמש בתו כדי להציג שלב למשל. 2/5 כלומר מתחיל ב 2 אז כל 5 (2,7,12,17,22 ...). הם לא עוטפים את הסוף.
  • כוכבית (*) בשדה מסמל את כל הטווח עבור שדה זה (למשל 0-59 עבור שדה דקה).
  • ניתן לשלב טווחים ומדרגות, למשל. */2 מסמל החל מהמינימום עבור השדה הרלוונטי ולאחר מכן כל 2 למשל 0 דקות (0,2 ... 58), 1 במשך חודשים (1,3 ... 11) וכו '

באגים פקודות cron

בדוק את הדואר! כברירת מחדל, cron ישלח כל פלט מהפקודה למשתמש בו הוא פועל. אם אין פלט לא יהיה דואר. אם אתה רוצה ש- cron ישלח דואר לחשבון אחר, תוכל להגדיר את משתנה הסביבה MAILTO בקובץ crontab למשל.

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

לכוד את הפלט בעצמך

1 2 * * *  /path/to/your/command &>/tmp/mycommand.log

אשר לוכדת stdout ו stderr ל / tmp /mycommand.log

תסתכל על היומנים; cron יומני פעולות שלה באמצעות syslog, אשר (בהתאם ההתקנה שלך) לעתים קרובות ללכת /var/log/cron או /var/log/syslog.

אם נדרש, תוכל לסנן את הצהרות ה- cron עם למשל.

grep CRON /var/log/syslog 

כעת, לאחר שעברנו את היסודות של cron, היכן הקבצים וכיצד להשתמש בהם הבה נבחן כמה בעיות נפוצות.

ודא שקרון פועל

אם cron אינו פועל, הפקודות שלך לא יהיו מתוזמנות ...

ps -ef | grep cron | grep -v grep

צריך להביא לך משהו כזה

root    1224   1  0 Nov16 ?    00:00:03 cron

או

root    2018   1  0 Nov14 ?    00:00:06 crond

אם לא הפעל אותו מחדש

/sbin/service cron start

או

/sbin/service crond start

יכולות להיות שיטות אחרות; להשתמש מה distro שלך מספק.

cron פועל הפקודה שלך בסביבה מוגבלת.

מה משתני הסביבה זמינים צפוי להיות מוגבל מאוד. בדרך כלל, תקבל רק כמה משתנים מוגדרים, כגון $LOGNAME, $HOME, ו $PATH.

ראוי לציון במיוחד PATH מוגבל /bin:/usr/bin. הרוב המכריע של "סקריפט cron שלי לא עובד" הבעיות נגרמות על ידי הנתיב המגביל הזה. אם הפקודה שלך נמצאת במיקום אחר, תוכל לפתור זאת בכמה דרכים:

  1. ספק את הנתיב המלא לפקודה.

    1 2 * * * /path/to/your/command
    
  2. לספק PATH מתאים בקובץ crontab

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

אם הפקודה שלך דורש משתני סביבה אחרים אתה יכול להגדיר אותם בקובץ crontab מדי.

cron פועל עם הפקודה cwd == $ HOME

לא משנה היכן התוכנית שאתה מבצע מתגורר על מערכת הקבצים, ספריית העבודה הנוכחית של התוכנית כאשר cron פועל זה יהיה ספריית הבית של המשתמש. אם אתה ניגש לקבצים בתוכנית שלך, עליך לקחת זאת בחשבון אם אתה משתמש בנתיבים יחסיים, או (רצוי) פשוט להשתמש בנתיבים מלאים במלואם בכל מקום, ולשמור את כולם הרבה בלבול.

הפקודה האחרונה ב crontab שלי אינו פועל

Cron בדרך כלל דורש פקודות מסתיימות עם קו חדש. עריכת crontab שלך; עבור לסוף השורה המכילה את הפקודה האחרונה והכנס שורה חדשה (הקש enter).

בדוק את הפורמט crontab

אתה לא יכול להשתמש crontab משתמש crontab מעוצב עבור / etc / crontab או שברי ב / etc / cron.d ולהיפך. משתמש מעוצב crontab אינו כולל שם משתמש במיקום 6 של שורה, בעוד מערכת crontab מעוצב כולל את שם המשתמש ומפעיל את הפקודה כמו המשתמש.

שמתי קובץ ב- /etc/cron.{hourly,daily,weekly,monthly} והוא אינו פועל

  • ודא ששם הקובץ אינו כולל תוסף ריצה חלקים
  • ודא שלקובץ יש הרשאות לביצוע.
  • תגיד את המערכת מה להשתמש בעת ביצוע סקריפט שלך (למשל, לשים #!/bin/sh למעלה)

Cron תאריך באגים בנושא

אם התאריך שלך השתנה לאחרונה על ידי משתמש או עדכון מערכת, אזור זמן או אחר, אז crontab יתחילו להתנהג באופן לא יציב ולהציג באגים מוזרים, לפעמים עובד, לפעמים לא. זהו ניסיון של crontab לנסות "לעשות מה שאתה רוצה" כאשר הזמן משתנה מתחת מתחתיו. השדה "דקה" יהפוך ללא יעיל לאחר שינוי שעה. בתרחיש זה, רק כוכביות יתקבלו. הפעל מחדש את cron ונסה זאת שוב מבלי להתחבר לאינטרנט (כך שאין תאריך לאפס לאחת משרתי הזמן).

שוב שלטים

כדי להדגיש את עצת הסימנים באחוזים, הנה דוגמה למה שקרון עושה איתם:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

תיצור את הקובץ ~ / cron.out המכיל את 3 השורות

foo
bar
baz

זה פולשני במיוחד בעת השימוש date פקודה. הקפד להימלט סימני אחוזים

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

274
2017-10-09 15:29



ייתכן שתרצה להזכיר גם את הקטע 'env' המוגבל ש- LD_LIBRARY_PATH עשוי גם להיות זקוק לכל ספריות נוספות שנקבעו למקרה שמשימת ה- cron שלך נכשלת בשל חוסר היכולת לאתר ספריות משותפות. - DavidJ
שים לב שאתה אפילו יכול לכתוב משהו כזה: 35 1,5-23 / 2 * * * do_something במקום 35,1,5,7,9, .. * * * בנוסף לכך crontab.guru מתרגמת את הערכים שאתה עושה לשפה האנושית. - Dennis Nolte
לכידת הפלט לא עובד בשבילי, יכול להיות בגלל הקליפה sh. אני חושב שזה נייד יותר: ... /path/to/your/command >/tmp/mycommand.log 2>&1 - chus
זה עבד בשבילי: sudo apt-get install postfix - jmunsch
עושה עבודה cron גם תלוי עד כמה כבד הקובץ? כי אני פשוט רצה שלום עולם עם פיתון עם cron, זה עבד. אבל הקוד השני שלי היה קצת כבד בדרך כלל לרוץ אבל עם cron זה לא נותן שום פלט לקובץ. - Devendra Bhat


אם cronjobs שלך להפסיק לעבוד, לבדוק את הסיסמה has not פג., מאז פעם זה, כל עבודות cron להפסיק.
יהיו הודעות /var/log/messages בדומה לזו שבהמשך, אשר מציגים בעיות באימות המשתמש:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


18
2018-02-04 20:29



רק יש לי את זה גם כן (קובץ הודעת שגיאה / var / log / syslog בשבילי). במקרה שלי תיבת DigitalOcean כי, בזמן ליצור, הם לאפס את סיסמת השורש (אופציונלי) אחרת, וכנראה עד שאתה נכנס לשם ולשנות את זה, כל עבודות cron לא לרוץ. באסה. תקן הוא משהו כמו sudo -u root passwd - rogerdpack


לדביאן לינוקס ולנגזרת שלה (אובונטו, מנטה, וכו ') יש כמה מוזרויות שעלולות למנוע את העבודה cron שלך מ ביצוע; בפרט, את הקבצים ב /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly} צריך :

  • להיות בבעלות שורש
  • ניתן לכתיבה רק על ידי השורש
  • לא ניתן לכתוב על ידי קבוצה או משתמשים אחרים
  • יש שם ללא נקודות ". או כל תו מיוחד אחר, אבל - "" ו- "_".

האחרון כואב באופן קבוע תמימים משתמשים; במיוחד כל סקריפט באחת התיקיות האלה בשם whatever.sh, mycron.py, testfile.pl, וכו 'יהיה לא להתבצע, אי פעם.

מניסיוני, נקודה מסוימת זו היתה ללא ספק הסיבה השכיחה ביותר עבור cronjob שאינו ביצוע על דביאן ונגזרות.

ראה man cron לפרטים נוספים, במידת הצורך.


15
2017-11-17 14:37





לוחות זמנים נדירים ולא סדירים

Cron הוא כל הדברים נחשב מתזמן בסיסי מאוד התחביר לא בקלות לאפשר למנהל לגבש לוחות זמנים קצת יותר נדיר.

שקול את העבודה הבאה אשר בדרך כלל יהיה הסביר "לרוץ command כל 5 דקות "You

*/5 * * * * /path/to/your/command

נגד:

*/7 * * * * /path/to/your/command

איזה לא תמיד לרוץ command כל 7 דקות.

זכור כי / ניתן להשתמש בתו כדי להציג צעד, אך השלבים אינם מתפתחים מעבר לסוף סדרה, למשל. */7 אשר תואם כל דקה 7 דקות 0-59  כלומר, 0,7,14,21,28,35,42,49,56 אבל בין שעה למשנהו יהיה רק 4 דקות בין קבוצות, לאחר 00:56 סדרה חדשה מתחילה ב 01:00, 01:07 וכו '(וקבוצות לא יפעל על 01:03 , 01:10 , 01:17 וכו.).


מה לעשות במקום זאת?

יצירת קבוצות מרובות

במקום עבודה אחת cron, ליצור אצווה מרובים המשולבים התוצאה בלוח הזמנים הרצוי.

לדוגמה, כדי להריץ אצווה כל 40 דקות (00:00, 00:40, 01:20, 02:00 וכו ') ליצור שתי קבוצות, אחת שפועלת פעמיים על שעות ואפילו השנייה שמפעילה רק את השעות המוזרות:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

הפעל את קבוצותיך בתדירות נמוכה יותר 

במקום לרוץ אצווה שלך כל 7 דקות, וזה לוח זמנים קשה לשבור במספר אצוות, פשוט להפעיל אותו כל 10 דקות במקום.

הפעל את הקבוצות שלך בתדירות גבוהה יותר 

לוחות זמנים מוזרים רבים להתפתח בגלל אצווה runtimes להגדיל / להשתנות ואז אצוות לקבל מתוזמן עם קצת שולי בטיחות נוספים כדי למנוע רצים הבאים של אצווה אותו מ חופפים ורצים בו זמנית.

במקום זאת, לחשוב אחרת וליצור cronjob כי תיכשל בחן כאשר הריצה הקודמת לא סיימה עדיין, אבל אשר יפעלו אחרת. תראה את זה Q & AYou

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job --minutely

על הערה דומה, אתה יכול לתת לך שיא אצווה חותמת של הריצה המוצלחת האחרונה בתחילת בדיקת אצווה אם המרווח הרצוי בין אצוות כבר עבר ולבצע אחרת לצאת בחן.

בתוך seven-minute-job ייראה משהו כמו:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
    echo "The minimum interval of 7 minutes between successive batches hasn't passed yet."
    exit
fi

echo "Start running your batch"

date > /tmp/lastrun

שבו אתה יכול ואז בבטחה (ניסיון) לרוץ בכל רגע:

* * * * * /path/to/your/seven-minute-job

אין להשתמש ב- cron

אם הצרכים שלך הם מורכבים אתה יכול לשקול שימוש במוצר מתקדם יותר המיועד להפעיל לוחות זמנים מורכבים (מופץ על פני מספר שרתים) ותומך טריגרים, תלות בעבודה, טיפול בשגיאות, ניטור חוזר וכו 'ז' רגון בתעשייה יהיה "הארגון" תזמון עבודה ו / או "אוטומציה עומס העבודה".


10
2017-10-23 04:45





PHP ספציפי

אם יש לך קצת עבודה cron כמו:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

ובמקרה של שגיאות לצפות, כי הם יישלחו אליך, אבל הם לא - לבדוק את זה.

PHP כברירת מחדל לא שולח שגיאות STDOUT. @see https://bugs.php.net/bug.php?id=22839

כדי לתקן את זה, להוסיף ב php.ini cli `` או את השורה שלך (או שלך עטיפת bash עבור PHP) אלה:

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

ההגדרה הראשונה תאפשר לך לקבל fatals כמו 'אופס זיכרון' ו 2 - כדי להפנות את כולם STDERR. רק לאחר שתוכל לישון טוב כמו כל יישלחו הדואר של השורש שלך במקום רק נרשם.


8



דוח השגיאה נסגר בשנת 2007 עם הסטטוס של התיקון שהתווסף לסניפי PHP 5.2+. האם אתה בטוח שזה נחוץ? אני רק ניסיתי על PHP 5.4 וזה נראה לעבוד בסדר. (זה עדיין נחוץ עבור PHP 4). - Xeoncross
@Xeoncross ראה תאריך התשובה :) - gaRex
כן, זה מה מבולבל מאז ענית ב -2013 והכרטיס חזר ב -07. - Xeoncross