لماذا مخطوطات كرونتاب لا تعمل?

في كثير من الأحيان, crontab لا يتم تنفيذ البرامج النصية في الموعد المحدد أو كما هو متوقع. هناك أسباب عديدة لذلك:

  1. تدوين كرونتاب خاطئ
  2. مشكلة الأذونات
  3. متغيرات البيئة

يهدف ويكي المجتمع هذا إلى تجميع أهم الأسباب ل crontab البرامج النصية لا يتم تنفيذها كما هو متوقع. اكتب كل سبب في إجابة منفصلة.

يرجى تضمين سبب واحد لكل إجابة-تفاصيل حول سبب عدم تنفيذه-وإصلاح (إس) لهذا السبب واحد.

يرجى كتابة فقط القضايا كرون محددة ، على سبيل المثال الأوامر التي تنفذ كما هو متوقع من قذيفة ولكن تنفيذ خطأ من قبل كرون.

بيئة مختلفة

كرون يمر مجموعة الحد الأدنى من متغيرات البيئة إلى وظائفك. لمعرفة الفرق ، أضف وظيفة وهمية مثل هذا:

>* * * * * إنف /تمب / إنف.الناتج

انتظر /tmp/env.output ليتم إنشاؤه ، ثم قم بإزالة المهمة مرة أخرى. الآن مقارنة محتويات /tmp/env.output مع إخراج env تشغيل في محطة العادية.

مشترك "مسكتك" هنا هو PATH متغير البيئة يجري مختلفة. ربما يستخدم البرنامج النصي كرون الخاص بك الأمر somecommand وجدت في /opt/someApp/bin، التي أضفتها إليها PATH في /etc/environment? كرون يتجاهل PATH من هذا الملف ، لذلك رونينغ somecommand من السيناريو الخاص بك سوف تفشل عند تشغيل مع كرون ، ولكن العمل عند تشغيل في محطة. ومن الجدير بالذكر أن المتغيرات من /etc/environment سيتم تمريرها إلى وظائف كرون ، وليس فقط المتغيرات كرون يحدد على وجه التحديد نفسها ، مثل PATH.

للالتفاف على ذلك ، مجرد مجموعة بنفسك PATH متغير في الجزء العلوي من البرنامج النصي. على سبيل المثال.

#!/bin/bashPATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# rest of script follows

يفضل البعض استخدام المسارات المطلقة لجميع الأوامر بدلا من ذلك. أوصي ضد ذلك. ضع في اعتبارك ما يحدث إذا كنت تريد تشغيل البرنامج النصي الخاص بك على نظام مختلف ، وعلى هذا النظام ، يكون الأمر في /opt/someAppv2.2/bin بدلا من ذلك. عليك أن تذهب من خلال استبدال البرنامج النصي بأكمله /opt/someApp/bin مع /opt/someAppv2.2/bin بدلا من مجرد القيام تحرير صغير على السطر الأول من البرنامج النصي.

يمكنك أيضا تعيين متغير المسار في ملف كرونتاب ، والتي سوف تنطبق على جميع وظائف كرون. على سبيل المثال.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin15 1 * * * backupscript --incremental /home /root

بلدي أعلى مسكتك: إذا كنت قد نسيت لإضافة سطر جديد في نهاية crontab الملف. وبعبارة أخرى ، يجب أن ينتهي ملف كرونتاب بسطر فارغ.

يوجد أدناه القسم ذي الصلة في صفحات الرجل لهذه المشكلة (man crontab ثم انتقل إلى النهاية):

   Although cron requires that each entry in a crontab end  in  a  newline   character,  neither the crontab command nor the cron daemon will detect   this error. Instead, the crontab will appear to load normally. However,   the  command  will  never  run.  The best choice is to ensure that your   crontab has a blank line at the end.   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

كرون الخفي لا يعمل. أنا حقا ثمل مع هذا قبل بضعة أشهر.

النوع:

pgrep cron 

إذا كنت ترى أي رقم (أي بيد الرئيسي كرون) ، ثم كرون لا يعمل. sudo /etc/init.d/cron start يمكن استخدامها لبدء كرون.

تحرير: بدلا من استدعاء البرامج النصية الحرف الأول من خلال /الخ/الحرف الأول.د ، استخدم الخدمة ، على سبيل المثال.

sudo service cron start

تحرير: كما يمكنك استخدام سيستمكتل في لينكس الحديثة ، على سبيل المثال.

sudo systemctl start cron

أسماء ملفات البرنامج النصي في cron.d/, cron.daily/, cron.hourly/، إلخ.، يجب ألا يحتوي على نقطة (.) ، وإلا فإن أجزاء التشغيل سوف تتخطاها.

انظر تشغيل-أجزاء (8):

   If neither the --lsbsysinit option nor the --regex option is given then   the names must consist entirely of upper and lower case  letters,  dig‐   its, underscores, and hyphens.   If  the  --lsbsysinit  option  is given, then the names must not end in   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to   one  or more of the following namespaces: the LANANA-assigned namespace   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace   (^[a-zA-Z0-9_-]+$).

لذلك ، إذا كان لديك برنامج نصي كرون backup.sh, analyze-logs.pl في cron.daily/ الدليل ، وكنت أفضل لإزالة أسماء التمديد.

في العديد من البيئات كرون ينفذ الأوامر باستخدام sh، بينما يفترض الكثير من الناس أنه سيستخدم bash.

اقتراحات لاختبار أو إصلاح هذا لأمر فاشل:

  • حاول تشغيل الأمر في sh لمعرفة ما إذا كان يعمل:

    sh -c "mycommand"
  • التفاف الأمر في باش سوبشيل للتأكد من أنه يحصل على تشغيل في باش:

    bash -c "mybashcommand"
  • أخبر كرون لتشغيل جميع الأوامر في باش عن طريق وضع قذيفة في الجزء العلوي من كرونتاب الخاص بك:

    SHELL=/bin/bash
  • إذا كان الأمر عبارة عن برنامج نصي ، فتأكد من أن البرنامج النصي يحتوي على شيبانج:

    #!/bin/bash

كان لدي بعض المشاكل مع المناطق الزمنية. كان كرون يعمل مع المنطقة الزمنية التثبيت الطازجة. كان الحل هو إعادة تشغيل كرون:

sudo service cron restart

يجب استخدام المسار المطلق للبرامج النصية:

على سبيل المثال, /bin/grep يجب استخدامه بدلا من grep:

# m h  dom mon dow   command0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

بدلا من:

# m h  dom mon dow   command0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

هذا أمر صعب بشكل خاص ، لأن نفس الأمر سيعمل عند تنفيذه من شل. والسبب هو أن cron ليس لديه نفس الشيء PATH متغير البيئة كمستخدم.

إذا كان الأمر كرونتاب الخاص بك لديه % الرمز في ذلك ، يحاول كرون تفسيره. لذلك إذا كنت تستخدم أي أمر مع % في ذلك (مثل مواصفات التنسيق لأمر التاريخ) سوف تحتاج إلى الهروب منه.

هذا وغيرها من غوتشاس جيدة هنا:
http://www.pantz.org/software/cron/croninfo.html

كرون يدعو السيناريو الذي هو غير قابل للتنفيذ.

عن طريق تشغيل chmod +x /path/to/script، يصبح البرنامج النصي قابلا للتنفيذ وهذا يجب أن يحل هذه المشكلة.

من الممكن أيضا أن تكون كلمة مرور المستخدم قد انتهت صلاحيتها. حتى كلمة مرور الجذر يمكن أن تنتهي. يمكنك tail -f /var/log/cron.log وسترى كرون تفشل مع كلمة المرور منتهية الصلاحية. يمكنك تعيين كلمة المرور حتى لا تنتهي صلاحيتها أبدا عن طريق القيام بذلك: passwd -x -1 <username>

في بعض الأنظمة (ديبيان ، أوبونتو) لا يتم تمكين تسجيل الدخول إلى كرون بشكل افتراضي. في / الخ / رسيسلوغ.أسيوط أو / الخ / رسيسلوغ.د / 50-افتراضي.أسيوط الخط:

# cron.*                          /var/log/cron.log

يجب تحريرها (sudo nano /etc/rsyslog.conf) غير معلن ل:

cron.*                          /var/log/cron.log

بعد ذلك ، تحتاج إلى إعادة تشغيل رسيسلوغ عبر

/etc/init.d/rsyslog restart

أو

service rsyslog restart 

المصدر: تمكين تسجيل كرونتاب في ديبيان لينكس

في بعض الأنظمة (أوبونتو) لم يتم تمكين ملف تسجيل منفصل ل كرون افتراضيا ، ولكن السجلات ذات الصلة كرون تظهر في ملف سيسلوغ. يمكن للمرء استخدام

cat /var/log/syslog | grep cron -i

لعرض الرسائل المتعلقة كرون.

يجب إغلاق ‘كرونتاب-ه’ لكرون أن تأخذ تأثير. على سبيل المثال باستخدام فيم أنا تحرير الملف واستخدام لكتابة ذلك ولكن لا يتم إضافة المهمة إلى كرون حتى استقال أيضا. لذلك لن أرى الوظيفة إلا بعد’: س ’ أيضا.

أعتقد أن أفضل طريقة لتصحيح كرون هو التحقق من سيسلوغ والعثور على المشاكل.

في حالتي-كان البريد الإلكتروني ذاهبا إلى مجلد الرسائل غير المرغوب فيها ، لذلك… تحقق من ذلك قبل قضاء ساعات في تصحيح الأخطاء: د

انقطاع الكهرباء

يرجى التحقق من هذا واحد cron - Script doesn't run via crontab but works fine standalone - Ask Ubuntu