שאלה הפעלת עבודת קרון באופן ידני ומיד


(כבר קראתי כיצד ניתן לבדוק תסריט cron חדש?.)

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


94
2017-11-18 13:55




(מצטער לא יכול להוסיף תגובה) 0 30 16 20 *? * גם אם אתה מפעיל את העבודה ככה, כל הרעיון הוא לספק פלט Script כדי לראות מה הולך בסדר, אלא אם כן כותב את העבודה יומן, זה quuiet חסר תועלת


תשובות:


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


שלב 1: שמתי את הקו הזה באופן זמני crontab של המשתמש:

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

ואז הוציא את זה פעם אחת את הקובץ נכתב.

שלב 2: עשיתי את עצמי קצת לרוץ כמו cron סקריפט bash המכיל:

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

אז, כמו המשתמש המדובר, הייתי מסוגל

run-as-cron /the/problematic/script --with arguments --and parameters

פתרון זה יכול כמובן להיות מורחבת כדי לעשות שימוש sudo או כאלה עבור גמישות רבה יותר.

מקווה שזה עוזר לאחרים.


73
2017-11-18 14:40



זה לא עובד בשבילי ואני תוהה אם זה עושה עבור כל מי upvoted. 1) למה אתה משתמש bash? זה לא נדרש כאן וזה לא יכול להיות ממוקם /usr/bin. 2) cat …/cron-env פלט שורות מרובות, וזה לא עובד. רק לנסות לבצע /usr/bin/env -i $(cat cron-env) echo $PATH בטרמינל, הוא מפיק את הסביבה פשוטו כמשמעו במקום להשתמש בה. 3) הסביבה הנוכחית דולף אל הסביבה cron חיקוי. נסה: export foo=leaked; run-as-cron echo $foo. - Marco
@Marco עובד בבאש, וזה מה שאני משתמש בו היא סביבה מוגדרת טוב יותר מאשר sh. אני משתמש בכל דבר, החל pdksh, ksh (גרסאות מרובות), bash ו מקף אז אני מודע מאוד ההבדלים בין מימושים של "טהור" של sh, גם כאשר נשארים מאוד בקפידה משותפת של השפות. Youנות - Max Murphy
@ מרקו 2. cat פלט שורות מרובות, אשר עושים עבודה, כי החלפת פגז מתמוטט אותם לתוך שורה אחת, שבו אתה יכול לבדוק עם echo $(cat cron-env ) | wc; הפקודה, /usr/bin/env -i $(cat cron-env) echo $PATH, תחליפים $PATH מן הקליפה הקוראת; במקום זאת, היא צריכה ליצור תת-נושא להחליף בתת-המשנה, למשל. /usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'. 3. אתה עשית את אותה טעות, שוב להחליף את הקליפה מתקשר במקום בתת הסביבה - John Freeman


אני מציג פתרון מבוסס על התשובה פיסטוס, אבל ללא הפגמים.

  • הוסף את השורה הבאה ל- crontab, למשל. באמצעות crontab -e

    * * * * *  /usr/bin/env > /home/username/cron-env
    
  • יצירת סקריפט פגז אשר מבצעת פקודה באותה סביבה כמו עבודות cron לרוץ:

    #!/bin/sh
    
    . "$1"
    exec /usr/bin/env -i "$SHELL" -c ". $1; $2"
    

להשתמש:

run-as-cron <cron-environment> <command>

למשל

run-as-cron /home/username/cron-env 'echo $PATH'

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


34
2017-09-24 18:46



זה עזר לי לשחזר את אודם הקשורות הספינקס שגיאה שגיאה. - cweiske
השתמשתי באפשרות @ creb אפשרות לכתוב את קובץ ה- cron-env. לאחר מכן תוכל להשאיר אותו crontab וזה יהיה רק ​​rewritten כאשר המערכת מתחילה. זה עושה את זה קצת יותר פשוט, כי אתה לא צריך להוסיף / להסיר קווים. - Michael Barton


כמו crontab לא לעשות את העבודה, תוכל לתפעל את התוכן של זה:

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done

מה שזה עושה :

  • רשימות משרות
  • להסיר שורות הערה
  • להסיר את תצורת crontab
  • ולאחר מכן להפעיל אותם אחד אחד

14
2017-08-19 19:45



זה לא בהכרח עושה את זה באותו סביבה כי cron היה, אם כי, ואני חשבתי שהוא רוצה לבדוק רק אחד מהם. - Falcon Momot
נכון, אני טועה ... זה רק להפעיל את העבודות אבל לא כמו cron יעשה! - Django Janny
עדיין פתרון מדהים +1 - Eric Uldall


כברירת מחדל עם רוב הדמונים cron ברירת המחדל שראיתי, יש פשוט אין דרך לספר cron לרוץ כאן עכשיו. אם אתה משתמש anacron, ייתכן שאני חושב להפעיל מופע נפרד בחזית.

אם הסקריפטים שלך אינם פועלים כראוי אז אתה לא לוקח בחשבון את זה

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

מאת crontab (5):

נקבעו מספר משתני סביבה   (8)   דמון. SHELL מוגדר / bin / sh, ו   LOGNAME ו- HOME נקבעים מתוך   / etc / passwd שורה של crontab של   בעלים. PATH מוגדר "/ usr / bin: / bin".   דף הבית, מעטפת, ו PathH עשוי להיות   על ידי הגדרות ב - Windows XP   crontab; LOGNAME הוא המשתמש   העבודה היא פועל, ולא יכול להיות   השתנה.

באופן כללי PATH היא הבעיה הגדולה ביותר, ולכן עליך:

  • הגדר באופן מפורש את ה- PATH בתוך התסריט, תוך בדיקה, ל- usr / bin: / bin. אתה יכול לעשות את זה עם bash ייצוא PATH = "/ usr / bin: / bin"
  • הגדר באופן מפורש את PATH הנכון אתה רוצה בחלק העליון של crontab. למשל PathH = "/ usr / bin: / bin: / usr / local / bin: / usr / sbin: / sbin"

אם עליך להפעיל את הסקריפט כמשתמש אחר ללא קליפה (למשל, נתוני www), השתמש ב- sudo:

sudo -u www-data /path/to/crontab-script.sh

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


5
2017-11-18 14:27



תודה על התגובה היסודית. אני מודע לשני הנושאים של ריצה כמשתמש מסוים, ועם סביבה מסוימת. ככזה, ניסחתי את התשובה שלי, אשר אני עכשיו לכתוב ... - Pistos
תווים בריחה הם סיבות חוקיות לכך שהתפקיד אינו פועל - Joe Phillips


ובכן, המשתמש הוא זהה לזה שאתה מכניס ערך crontab (או crontab אתה שם את זה, לסירוגין), אז זה לא brainer. crontab(5) צריך לתת לך את רשימת משתני הסביבה להגדיר, יש רק כמה.


1
2017-11-18 14:04



במילים אחרות, אתה אומר שאין דרך לעשות את זה? רק "קרוב מספיק" דרכים לעקיפת הבעיה? - Pistos
לא, אני אומר שאתה יכול לעשות את זה, תוך שימוש במידע שסיפקתי בתשובה שלי. - womble♦


ברוב crontabs כמו למשל vixie-cron אתה יכול למקם משתנים crontab עצמו ככה ולאחר מכן להשתמש / usr / bin / env כדי לבדוק אם זה עבד. בדרך זו אתה יכול לעשות את התסריט לעבוד crontab ברגע שגילית מה לא בסדר עם לרוץ כמו ב- cron script.

SHELL=/bin/bash
LANG=en
FASEL=BLA

* * * * *   /usr/bin/env > /home/username/cron-env

1
2017-10-27 06:52





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

#!/usr/bin/env python
from __future__ import division, print_function

import sys
import os

def main():
    if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help'):
        print("Usage: {} CMD\n"
              "Run a command as cron would. Note that CMD must be quoted to be only one argument."
              .format(sys.argv[0]))
        sys.exit(1)
    _me, cmd = sys.argv
    env = dict(line.strip().split('=', 1) for line in open('/tmp/cron-env'))
    sh = env['SHELL']
    os.execvpe(sh, [sh, '-c', cmd], env)

if __name__ == '__main__':
    main()

1
2017-12-24 08:48





הפתרון של מרקו לא עבד בשבילי, אבל כתב הפייתון של נועם עבד. הנה שינוי קל של התסריט של מרקו כי עשה את זה עובד בשבילי:

#!/bin/sh
. "$1"
exec /usr/bin/env -i "$SHELL" -c "set -a;. $1; $2"

נוסף set -a לייצא משתנים מוגדרים ב script $ 1 ו עשה את זה זמין הפקודה $ 2

p.s. הפייתון של נועם עבד כי הוא "ייצא" את הסביבה לתהליך הילד.


1
2018-05-11 05:05





מעולם לא מצאתי דרך להפעיל עבודות קרון באופן ידני אבל זה לכתוב מעלה מציע הגדרה בסביבה זהה cronjob היה מפעיל את התסריט באופן ידני.


0
2017-11-18 14:07



זה לא מה שאתה מציע לעשות מה OP רוצה לדעת איך לעשות? - womble♦
וזו הסיבה שבגללה כללתי את הקישור לכתב המתאר כיצד לעשות זאת. לא חשבתי שיש צורך להעתיק ולהדביק הכל כאן. - oneodd1


אתה יכול לתכנת את העבודה כדי להתחיל את הרגע הבא :)


0
2017-09-23 13:52



59 שניות זה הרבה זמן. - Stéphane Bruckert
אופ ציין אפשרות זו בשאלה: "האם יש דרך לעשות את זה?" לאחר 60 שניות כדי לבדוק את השינויים בתסריט זה לא מעשי. - Andrew Grimm
59 שניות הוא כנראה פחות ממה שנדרש כדי לבחור וליישם כל אחד אחרים הציע (ולא מובטחת לעבוד) פתרונות. כשאני רואה חסרונות כאלה אני תוהה איך לינוקס הפך כזה דה פקטו שרת סטנדרטי שרת. האם לא כל סיסדמין רציני רוצה לבדוק את עבודתם? - Rolf