كرون على لينكس: التاريخ والاستخدام والجهاز


كتب الكلاسيكية أنه لا يتم ملاحظة ساعات سعيدة. في تلك الأوقات العصيبة ، لم يكن هناك مبرمجون ولا يونكس ، لكن المبرمجين في الوقت الحاضر يعرفون جيدًا: بدلاً من ذلك ، سيتبع cron الوقت.


الأدوات المساعدة لسطر الأوامر بالنسبة لي هي الضعف والروتين. يتم تشغيل برامج sed و awk و wc و cut والبرامج القديمة الأخرى بواسطة البرامج النصية على خوادمنا يوميًا. تم تصميم العديد منهم كمهام cron ، وجدولة من 70s.


لفترة طويلة ، استخدمت كرون بشكل سطحي ، دون الخوض في التفاصيل ، ولكن مرة واحدة ، بعد أن واجهت خطأً عند تشغيل البرنامج النصي ، قررت اكتشافه بدقة. لذلك ظهرت هذه المقالة ، عند الكتابة التي تعرفت عليها POSIX crontab ، المتغيرات الرئيسية في توزيع توزيعات Linux الشهيرة وجهاز بعضها.


باستخدام لينكس وتشغيل المهام في كرون؟ هل أنت مهتم في تطبيق نظام يونيكس؟ ثم نحن في الطريق!


محتوى



أصل الأنواع


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


تستمد أنظمة التشغيل المشابهة لنظام Unix نسبها من الإصدار 7 Unix ، الذي طورته شركة Lab Labs في السبعينيات ، بما في ذلك Ken Thompson الشهير. بالإضافة إلى الإصدار 7 Unix ، تم توفير cron ، وهي خدمة للتنفيذ المنتظم لمهام الخارق.


cron النموذجي الحديث هو برنامج بسيط ، لكن خوارزمية الإصدار الأصلي كانت أكثر بساطة: استيقظت الخدمة مرة واحدة في الدقيقة ، وقراءة لوحة المهام من ملف واحد (/ etc / lib / crontab) وتنفيذ المهام التي ينبغي تنفيذها في الوقت الحالي للمستخدم الخارق .


في وقت لاحق ، جاءت الخيارات المتقدمة لخدمة بسيطة ومفيدة مع جميع أنظمة التشغيل المشابهة لـ Unix.


تم تضمين أوصاف عامة لتنسيق crontab والمبادئ الأساسية للأداة في عام 1992 في المعيار الرئيسي لأنظمة التشغيل المشابهة لنظام Unix - POSIX - وبالتالي أصبح cron من المعيار الفعلي هو المعيار القانوني.


في عام 1987 ، قام Paul Vixie ، بعد إجراء مقابلة مع مستخدمي Unix للحصول على اقتراحات بشأن cron ، بإصدار إصدار آخر من البرنامج الخفي الذي يعمل على إصلاح بعض مشكلات cron التقليدية ويوسع بناء جملة ملفات الجدول.


في الإصدار الثالث ، بدأت Vixie cron في تلبية متطلبات POSIX ، بالإضافة إلى أن البرنامج كان لديه ترخيص ليبرالي ، أو بالأحرى لم يكن هناك ترخيص على الإطلاق ، باستثناء رغبات README: المؤلف لا يعطي ضمانات ، لا يمكنك إزالة اسم المؤلف ، ويمكنك فقط بيع البرنامج مع شفرة المصدر. اتضح أن هذه المتطلبات تتوافق مع مبادئ البرمجيات الحرة ، التي كانت تكتسب شعبية في تلك السنوات ، لذا فإن بعض توزيعات Linux الرئيسية التي ظهرت في أوائل التسعينيات أخذت Vixie cron كتوزيع للنظام ولا تزال تعمل على تطويره.


على وجه الخصوص ، تعمل Red Hat و SUSE على تطوير شوكة Vixie cronie ، بينما يستخدم Debian و Ubuntu cron Vixie الأصلي مع العديد من التصحيحات.


أولاً ، دعونا نتعرف على أداة crontab المعرفة من قبل المستخدم الموضحة في POSIX ، وبعد ذلك سنحلل امتدادات بناء الجملة المقدمة في Vixie cron واستخدام صيغ Vixie cron في توزيعات Linux الشائعة. وأخيرا ، فإن الكرز على الكعكة هو تحليل للجهاز الخفي cron.


Posix crontab


إذا كان cron الأصلي يعمل دائمًا مع المستخدم الخارق ، فغالبًا ما يتعامل المجدولون الحديثون مع مهام المستخدمين العاديين ، والتي تعد أكثر أمانًا وملاءمة.


يتم شحن Cron مع مجموعة من برنامجين: البرنامج الخفي المستمر cron والأداة المساعدة crontab المتاحة للمستخدمين. يتيح لك هذا الأخير تحرير جداول المهام الخاصة بكل مستخدم في النظام ، بينما يبدأ البرنامج الخفي في تنفيذ المهام من جداول المستخدم والنظام.


لا يصف معيار POSIX سلوك البرنامج الخفي ، ويتم إضفاء الطابع الرسمي على برنامج المستخدم crontab فقط. وجود آليات لبدء مهام المستخدم ، بطبيعة الحال ، ضمني ، ولكن لم يتم وصفه بالتفصيل.


هناك أربعة أشياء يمكنك القيام بها باستخدام الأداة المساعدة crontab: تحرير جدول مهام المستخدم في المحرر ، وتحميل الجدول من الملف ، وإظهار جدول المهام الحالي ، ومسح جدول المهام. أمثلة من الأداة المساعدة crontab:


crontab -e #    crontab -l #    crontab -r #    crontab path/to/file.crontab #      

عند استدعاء crontab -e ، سيتم استخدام المحرر المحدد في EDITOR بيئة EDITOR القياسي.


يتم وصف المهام نفسها بالتنسيق التالي:


 # -  # # ,   * * * * * /path/to/exec -a -b -c # ,   10-    10 * * * * /path/to/exec -a -b -c # ,   10-            10 2 * * * /path/to/exec -a -b -c > /tmp/cron-job-output.log 

الحقول الخمسة الأولى للتسجيل: الدقائق [1..60] ، الساعات [0..23] ، أيام الشهر [1..31] ، الشهور [1..12] ، أيام الأسبوع [0..6] ، حيث 0 - الأحد. الحقل الأخير ، السادس ، عبارة عن سلسلة سيتم تنفيذها بواسطة مترجم الأوامر القياسي.


في الحقول الخمسة الأولى ، يمكن سرد القيم بفاصلة:


 # ,         1,10 * * * * /path/to/exec -a -b -c 

أو من خلال واصلة:


 # ,          0-9 * * * * /path/to/exec -a -b -c 

يتم تنظيم وصول المستخدم إلى جدولة المهام في ملفات POSIX cron.allow و cron.deny التي تسرد ، على التوالي ، المستخدمين الذين لديهم حق الوصول إلى crontab والمستخدمين دون الوصول إلى البرنامج. المعيار لا ينظم موقع هذه الملفات.


يجب أن يتم تشغيل البرامج قيد التشغيل ، وفقًا للمعيار ، أربعة متغيرات بيئة على الأقل:


  1. الصفحة الرئيسية هي الدليل الرئيسي للمستخدم.
  2. LOGNAME - تسجيل دخول المستخدم.
  3. PATH هو المسار الذي يمكن من خلاله العثور على الأدوات المساعدة للنظام القياسية.
  4. شل هو الطريق إلى قذيفة المستخدمة.

من الجدير بالذكر أن POSIX لا يقول شيئًا عن مصدر قيم هذه المتغيرات.


الأكثر مبيعًا - Vixie cron 3.0pl1


سلف مشترك من المتغيرات الشعبية كرون هو Vixie cron 3.0pl1 ، قدمت على 1992 comp.sources.unix القائمة البريدية. الملامح الرئيسية لهذا الإصدار سوف ننظر في مزيد من التفاصيل.


Vixie cron يأتي في برنامجين (cron و crontab). كالمعتاد ، يكون البرنامج الخفي مسؤولاً عن قراءة وبدء المهام من جدول مهام النظام وجداول المهام للمستخدمين الفرديين ، وتكون الأداة المساعدة crontab مسؤولة عن تحرير جداول المستخدمين.


جدول المهام وملفات التكوين


يقع جدول مهام المستخدم الخارق في / etc / crontab. يتوافق بناء جملة جدول النظام مع بناء جملة Vixie cron ، الذي تم ضبطه لحقيقة أن العمود السادس يشير إلى اسم المستخدم الذي تم إطلاق المهمة نيابة عنه:


 #     vlad * * * * * vlad /path/to/exec 

توجد جداول مهام المستخدم الشائعة في / var / cron / tabs / اسم المستخدم وتستخدم بناء جملة شائع. عند بدء تشغيل الأداة المساعدة crontab ، يتم تحرير هذه الملفات نيابة عن المستخدم.


تتم إدارة قوائم المستخدمين الذين لديهم حق الوصول إلى crontab في الملفات / var / cron / allow و / var / cron / deny ، حيث يكفي إضافة اسم المستخدم كخط منفصل.


بناء الجملة الموسعة


بالمقارنة مع POSIX crontab ، يحتوي حل Paul Vixie على العديد من التعديلات المفيدة للغاية في بناء جملة جدول المهام المساعدة.


أصبح بناء جملة جدول جديد متاحًا: على سبيل المثال ، يمكنك تحديد أيام الأسبوع أو الأشهر بالاسم (Mon ، Tue ، وما إلى ذلك):


 #         * * * Jan Mon,Tue /path/to/exec 

يمكنك تحديد الخطوة التي يتم من خلالها بدء المهام:


 #       */2 * * * Mon,Tue /path/to/exec 

يمكن خلط الخطوات والفواصل الزمنية:


 #             0-10/2 * * * * /path/to/exec 

يتم دعم البدائل البسيطة للبناء العادي (إعادة التشغيل ، سنوي ، سنوي ، شهري ، أسبوعي ، يومي ، منتصف الليل ، كل ساعة):


 #     @reboot /exec/on/reboot #     @daily /exec/daily #     @hourly /exec/daily 

بيئة تنفيذ المهمة


يسمح لك Vixie cron بتغيير بيئة تشغيل التطبيقات.


لا يتم توفير متغيرات البيئة USER و LOGNAME و HOME فقط بواسطة البرنامج الخفي ، ولكن يتم أخذها من ملف passwd . يحصل متغير PATH على القيمة "/ usr / bin: / bin" ، ويحصل SHELL على القيمة "/ bin / sh". يمكن تغيير قيم جميع المتغيرات باستثناء LOGNAME في جداول المستخدم.


يتم استخدام بعض متغيرات البيئة (بشكل أساسي SHELL و HOME) بواسطة cron نفسه لتشغيل المهمة. إليك ما يبدو أنه استخدام bash بدلاً من sh القياسي لتشغيل المهام المخصصة:


 SHELL=/bin/bash HOME=/tmp/ # exec   bash-  /tmp/ * * * * * /path/to/exec 

في النهاية ، سيتم نقل جميع متغيرات البيئة المحددة في الجدول (المستخدمة بواسطة cron أو ضرورية للعملية) إلى المهمة قيد التشغيل.


تستخدم الأداة المساعدة crontab المحرر المحدد في متغير البيئة VISUAL أو EDITOR لتحرير الملفات. إذا لم يتم تعريف هذه المتغيرات في البيئة التي تم فيها إطلاق crontab ، فسيتم استخدام "/ usr / ucb / vi" (ربما يكون ucb هو جامعة كاليفورنيا ، بيركلي).


كرون على ديبيان وأوبونتو


قام مطورو دبيان ومشتقاته بإصدار نسخة معدلة للغاية من Vixie cron version 3.0pl1. لا توجد اختلافات في بناء جملة ملفات الجدول ؛ بالنسبة للمستخدمين ، هذا هو نفس Vixie cron. أكبر الميزات الجديدة: دعم syslog و SELinux و PAM .


من التغييرات أقل وضوحا ، ولكن ملموسة - موقع ملفات التكوين وجداول المهام.


توجد جداول المستخدم في دبيان في الدليل / var / spool / cron / crontabs ، لا يزال جدول النظام موجودًا في / etc / crontab. يتم وضع جداول المهام الخاصة بـ دبيان في /etc/cron.d ، حيث يقرأها cron daemon تلقائيًا. يتم التحكم في وصول المستخدم بواسطة ملفات /etc/cron.allow و /etc/cron.deny.


لا يزال shell / bin / sh الافتراضي يستخدم كقذيفة افتراضية. يعمل Debian كقشرة شرطة صغيرة متوافقة مع POSIX تم إطلاقها دون قراءة أي تهيئة (في الوضع غير التفاعلي).


يتم إطلاق Cron نفسه في أحدث إصدارات دبيان عبر systemd ، ويمكن الاطلاع على تهيئة الإطلاق في /lib/systemd/system/cron.service. لا يوجد شيء خاص في تكوين الخدمة ؛ يمكن إجراء أي إدارة للمهام الدقيقة من خلال متغيرات البيئة التي تم الإعلان عنها مباشرة في crontab لكل مستخدم.


cronie على RedHat ، فيدورا و CentOS


cronie - شوكة Vixie cron الإصدار 4.1. كما في دبيان ، لم يتغير بناء الجملة ، ولكن تمت إضافة دعم PAM و SELinux ، والعمل في كتلة ، وتتبع الملفات باستخدام inotify ، وتمت إضافة ميزات أخرى.


التكوين الافتراضي في الأماكن المعتادة: جدول النظام في / etc / crontab ، الحزم تضع جداولها في /etc/cron.d ، جداول المستخدم تقع في / var / spool / cron / crontabs.


يعمل البرنامج الخفي تحت systemd ، وتكوين الخدمة هو /lib/systemd/system/crond.service.


عند بدء التشغيل ، تستخدم توزيعات Red Hat الشبيهة / bin / sh افتراضيًا ، يكون دورها bash قياسيًا. تجدر الإشارة إلى أنه عند تشغيل مهام cron خلال / bin / sh ، يبدأ تشغيل bash shell في وضع متوافق مع POSIX ولا يقرأ أي تكوين إضافي عند التشغيل في وضع غير تفاعلي.


كروني في SLES و openSUSE


يستخدم توزيع SLES الألماني ومشتق openSUSE نفس cronie. يتم تشغيل البرنامج الخفي أيضًا تحت systemd ، ويكون تكوين الخدمة في /usr/lib/systemd/system/cron.service. التكوين: / etc / crontab ، /etc/cron.d ، / var / spool / cron / tabs. يعمل / bin / sh نفس bash ، الذي تم إطلاقه في الوضع غير التفاعلي المتوافق مع POSIX.


Vixie جهاز كرون


لم يتغير أحفاد cron الحديثة بشكل جذري مقارنةً بـ Vixie cron ، لكن مع ذلك اكتسبوا قدرات جديدة غير مطلوبة لفهم مبادئ البرنامج. العديد من هذه الملحقات هي فوضوي والخلط بين التعليمات البرمجية. كود مصدر cron الأصلي بواسطة Paul Vixie يسعدني أن أقرأه.


لذلك ، قررت تحليل جهاز cron باستخدام مثال برنامج مشترك لكلا فرعي تطوير cron - Vixie cron 3.0pl1. سأبسط الأمثلة عن طريق إزالة ifdefs التي تعقد قراءة وحذف التفاصيل الثانوية.


يمكن تقسيم عمل الشيطان إلى عدة مراحل:


  1. تهيئة البرنامج.
  2. جمع وتحديث قائمة المهام لتشغيلها.
  3. عملية حلقة كرون الرئيسية.
  4. إطلاق المهمة.

دعونا فرزها بالترتيب.


التهيئة


عند بدء التشغيل ، بعد التحقق من وسيطات العملية ، يقوم cron بتثبيت معالجات الإشارة SIGCHLD و SIGHUP. الأول يسجل إتمام العملية الفرعية ، والثاني يغلق واصف الملف لملف السجل:


 signal(SIGCHLD, sigchld_handler); signal(SIGHUP, sighup_handler); 

يعمل الخفي cron في النظام دائمًا بمفرده ، فقط كمستخدم خارق ومن دليل cron الرئيسي. تقوم المكالمات التالية بإنشاء قفل ملف باستخدام معرف العملية لعملية الخفي ، وتأكد من صحة المستخدم ، وتغيير الدليل الحالي إلى الدليل الرئيسي:


 acquire_daemonlock(0); set_cron_uid(); set_cron_cwd(); 

يتم تعيين المسار الافتراضي ، والذي سيتم استخدامه عند بدء العمليات:


 setenv("PATH", _PATH_DEFPATH, 1); 

ثم يتم "شيطنة" العملية: فهي تنشئ نسخة فرعية من العملية عن طريق استدعاء الشوكة وجلسة جديدة في العملية الفرعية (استدعاء setid). لم تعد هناك حاجة للعملية الرئيسية - وهي تكمل المهمة:


 switch (fork()) { case -1: /*      */ exit(0); break; case 0: /*   */ (void) setsid(); break; default: /*     */ _exit(0); } 

إنهاء العملية الأصل إطلاق القفل على ملف القفل. بالإضافة إلى ذلك ، تحتاج إلى تحديث PID في الملف للطفل. بعد ذلك ، يتم تعبئة قاعدة بيانات المهمة:


 /*    */ acquire_daemonlock(0); /*   */ database.head = NULL; database.tail = NULL; database.mtime = (time_t) 0; load_database(&database); 

مزيد من كرون العائدات إلى دورة العمل الرئيسية. ولكن قبل ذلك ، ألق نظرة على تحميل قائمة المهام.


جمع وتحديث قائمة المهام


وظيفة load_database هي المسؤولة عن تحميل قائمة المهام. فإنه يتحقق النظام الرئيسي crontab والدليل مع ملفات المستخدم. إذا لم تتغير الملفات والدليل ، فلن تتم إعادة قراءة قائمة المهام. خلاف ذلك ، تبدأ قائمة مهام جديدة في النموذج.


تنزيل ملف نظام مع أسماء الملفات والجداول الخاصة:


 /*     ,  */ if (syscron_stat.st_mtime) { process_crontab("root", "*system*", SYSCRONTAB, &syscron_stat, &new_db, old_db); } 

تحميل جداول المستخدم في حلقة:


 while (NULL != (dp = readdir(dir))) { char fname[MAXNAMLEN+1], tabname[MAXNAMLEN+1]; /*      */ if (dp->d_name[0] == '.') continue; (void) strcpy(fname, dp->d_name); sprintf(tabname, CRON_TAB(fname)); process_crontab(fname, fname, tabname, &statbuf, &new_db, old_db); } 

ثم يتم استبدال قاعدة البيانات القديمة بأخرى جديدة.


في الأمثلة أعلاه ، فإن استدعاء وظيفة process_crontab يتأكد من وجود المستخدم الذي يطابق اسم ملف الجدول (ما لم يكن هو المستخدم الخارق) ، ثم يقوم باستدعاء load_user. هذا الأخير بالفعل يقرأ الملف نفسه سطرا بسطر:


 while ((status = load_env(envstr, file)) >= OK) { switch (status) { case ERR: free_user(u); u = NULL; goto done; case FALSE: e = load_entry(file, NULL, pw, envp); if (e) { e->next = u->crontab; u->crontab = e; } break; case TRUE: envp = env_set(envp, envstr); break; } } 

هنا ، يتم تعيين متغير البيئة (أسطر النموذج VAR = value) بواسطة دالات load_env / env_set ، أو تتم قراءة وصف المهمة (* * * * * / path / to / exec) بواسطة دالة load_entry.


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


 /*         passwd*/ e->uid = pw->pw_uid; e->gid = pw->pw_gid; /*    (/bin/sh),      */ e->envp = env_copy(envp); if (!env_get("SHELL", e->envp)) { sprintf(envstr, "SHELL=%s", _PATH_BSHELL); e->envp = env_set(e->envp, envstr); } /*   */ if (!env_get("HOME", e->envp)) { sprintf(envstr, "HOME=%s", pw->pw_dir); e->envp = env_set(e->envp, envstr); } /*     */ if (!env_get("PATH", e->envp)) { sprintf(envstr, "PATH=%s", _PATH_DEFPATH); e->envp = env_set(e->envp, envstr); } /*     passwd */ sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name); e->envp = env_set(e->envp, envstr); 

تعمل الدورة الرئيسية أيضًا مع قائمة المهام الحالية.


الدورة الرئيسية


عمل cron الأصلي من الإصدار 7 Unix بكل بساطة: في دورة أقوم بإعادة قراءة التكوين ، ركض على مهام اللحظة الحالية بصفتي الخارق وينام حتى بداية الدقيقة التالية. هذا النهج البسيط على الأجهزة القديمة يتطلب الكثير من الموارد.


تم اقتراح نسخة بديلة في SysV ، حيث كان الخفي نائما إما حتى الدقيقة التالية ، التي تم تحديد المهمة من أجلها ، أو لمدة 30 دقيقة. تم استهلاك موارد لإعادة قراءة التكوين وفحص المهام في هذا الوضع بشكل أقل ، ولكن أصبح من غير المناسب تحديث قائمة المهام بسرعة.


عادت Vixie cron إلى التحقق من قوائم المهام مرة واحدة في الدقيقة ، حيث أنه بحلول نهاية الثمانينات أصبحت الموارد على أجهزة Unix القياسية أكبر بكثير:


 /*    */ load_database(&database); /*  ,       */ run_reboot_jobs(&database); /*  TargetTime    */ cron_sync(); while (TRUE) { /*  ,     TargetTime    ,    */ cron_sleep(); /*   */ load_database(&database); /*      */ cron_tick(&database); /*  TargetTime     */ TargetTime += 60; } 

وظيفة cron_sleep ، التي تستدعي الوظائف job_runqueue (التعداد وبدء المهام) و do_command (بداية كل مهمة فردية) ، تشارك مباشرة في أداء المهام. يجب النظر في الوظيفة الأخيرة بمزيد من التفصيل.


إطلاق المهمة


يتم تنفيذ وظيفة do_command بنمط يونكس جيد ، أي أنها تقوم بعملية شوكة لتنفيذ المهام غير المتزامنة. تستمر العملية الأصل في إطلاق المهام ، وتقوم العملية الفرعية بإعداد عملية المهمة:


 switch (fork()) { case -1: /*   fork */ break; case 0: /*  :          */ acquire_daemonlock(1); /*      */ child_process(e, u); /*       */ _exit(OK_EXIT); break; default: /*     */ break; } 

يوجد الكثير من المنطق في عملية child_process: فهو يأخذ تدفقات الإخراج والخطأ القياسية على نفسه ، بحيث يمكن بعد ذلك إرساله إلى البريد (إذا تم تحديد متغير بيئة MAILTO في جدول المهام) ، وأخيرًا ، ينتظر إكمال عملية المهمة الرئيسية.


يتم تشكيل عملية المهمة بواسطة شوكة أخرى:


 switch (vfork()) { case -1: /*      */ exit(ERROR_EXIT); case 0: /* -   ,   .. */ (void) setsid(); /* *     ,    */ /*  ,    , *       */ setgid(e->gid); setuid(e->uid); chdir(env_get("HOME", e->envp)); /*    */ { /*   SHELL      */ char *shell = env_get("SHELL", e->envp); /*       , *    ,       */ execle(shell, shell, "-c", e->cmd, (char *)0, e->envp); /*  —    ?   */ perror("execl"); _exit(ERROR_EXIT); } break; default: /*    :      */ break; } 

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


خاتمة


Cron هو برنامج بسيط ومفيد بشكل مدهش ، صنع في أفضل تقاليد عالم يونكس. إنها لا تفعل أي شيء لا لزوم له ، لكنها كانت تقوم بعملها بشكل ملحوظ على مدى العقود القليلة الماضية. استغرق التعرف على رمز الإصدار الذي يأتي مع أوبونتو أكثر من ساعة ، وحصلت على الكثير من المرح! آمل أن أتمكن من مشاركتها معك.


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


هناك العديد من البدائل الحديثة لـ cron: تسمح لك أدوات توقيت النظام بتنظيم أنظمة معقدة ذات تبعيات ، في fcron يمكنك التحكم بشكل أكثر مرونة في استهلاك الموارد حسب المهام. ولكن شخصيا ، لقد كنت دائما أبسط crontab.


باختصار ، أحب يونيكس ، استخدم برامج بسيطة ولا تنس قراءة مانا لمنصتك!

Source: https://habr.com/ru/post/ar468061/


All Articles