کرون په لینکس کې: تاریخ، کارول او وسیله

کرون په لینکس کې: تاریخ، کارول او وسیله

کلاسیک لیکلي چې خوشحاله ساعتونه مه ګورئ. په هغه وحشي وختونو کې نه پروګرام کونکي وو او نه یونیکس، مګر نن ورځ پروګرام کونکي په ډاډ سره پوهیږي: کرون به د دوی پرځای وخت تعقیب کړي.

د کمانډ لاین اسانتیاوې زما لپاره ضعیف او یو کار دی. sed، awk، wc، cut او نور زاړه پروګرامونه هره ورځ زموږ په سرورونو کې د سکریپټونو لخوا پرمخ وړل کیږي. ډیری یې د کرون لپاره د دندو په توګه ډیزاین شوي، یو مهال ویشونکی په اصل کې د 70s څخه.

د اوږدې مودې لپاره ما کرون په سطحي ډول کارولی ، پرته لدې چې توضیحاتو ته لاړ شم ، مګر یوه ورځ ، کله چې زه د سکریپټ چلولو پرمهال له یوې غلطۍ سره مخ شوم ، ما پریکړه وکړه چې دا په بشپړ ډول وګورم. دا څنګه دا مقاله راڅرګنده شوه ، د دې لیکلو پرمهال زه د POSIX کرونټاب سره آشنا شوم ، د لینکس مشهور توزیعونو کې اصلي کرون اختیارونه او د دوی ځینې جوړښت.

ایا تاسو لینکس کاروئ او د کرون دندې پرمخ وړئ؟ ایا تاسو په یونیکس کې د سیسټم غوښتنلیک جوړښت سره علاقه لرئ؟ بیا موږ په لاره یو!

منځپانګې

د ډولونو اصل

د کارونکي یا سیسټم برنامو دوره ای اجرا کول په ټولو عملیاتي سیسټمونو کې څرګند اړتیا ده. له همدې امله، برنامه کونکي د خدماتو اړتیا احساس کړه چې دوی ته اجازه ورکوي په مرکزي توګه پلان جوړ کړي او ډیر وخت دمخه دندې اجرا کړي.

د یونیکس په څیر عملیاتي سیسټمونه خپل اصل بیرته نسخه 7 یونیکس ته لټوي، چې د تیرې پیړۍ په 70 کې په بیل لابراتوار کې رامینځته شوی، په شمول د مشهور کین تامپسن لخوا. د یونیکس 7 نسخه کې کرون هم شامل دی، په منظم ډول د سوپر کاروونکي دندو چلولو لپاره یو خدمت.

یو عادي عصري کرون یو ساده برنامه ده ، مګر د اصلي نسخې عملیاتي الګوریتم نور هم ساده و: خدمت په دقیقه کې یو ځل راپاڅیږي ، د یوې فایل (/etc/lib/crontab) څخه د دندو سره یو میز ولولئ او د دې لپاره ترسره شوی. سوپر کاروونکي هغه دندې چې باید په اوسني وخت کې ترسره شوي وي.

وروسته، د ساده او ګټور خدمت پرمختللې نسخې د ټولو یونیکس په څیر عملیاتي سیسټمونو سره چمتو شوي.

د کرونټاب فارمیټ عمومي توضیحات او د کارونې د عملیاتو لومړني اصول په 1992 کې د یونیکس په څیر عملیاتي سیسټمونو - POSIX - اصلي معیار کې شامل شوي ، او پدې توګه کرون د حقیقت له معیار څخه یو قانوني معیار شو.

په 1987 کې، پاول ویکسی، د کرون لپاره د دوی د هیلو په اړه د یونیکس کاروونکو سروې کړې، د ډیمون بله نسخه خپره کړه چې د دودیز کرون ځینې ستونزې یې سمې کړې او د میز فایلونو ترکیب یې پراخ کړ.

د ویکسی کرون دریمې نسخې لخوا د POSIX اړتیاو پوره کولو لپاره پیل شو ، سربیره پردې ، برنامه یو لیبرال جواز درلود ، یا بلکل هیڅ جواز شتون نلري ، پرته لدې چې په README کې غوښتنې: لیکوال تضمین نه ورکوي ، د لیکوال نوم حذف کیدی نشي، او برنامه یوازې د سرچینې کوډ سره یوځای پلورل کیدی شي. دا اړتیاوې د وړیا سافټویر اصولو سره مطابقت درلود چې په دې کلونو کې یې شهرت ترلاسه کړ، نو د لینوکس ځینې کلیدي توزیعونه چې د 90s په لومړیو کې څرګند شوي ویکسي کرون د دوی سیسټم په توګه اخیستی او نن ورځ یې وده کوي.

په ځانګړې توګه، Red Hat او SUSE د Vixie cron - cronie فورک رامینځته کوي، او Debian او Ubuntu د ډیری پیچونو سره د ویکسی کرون اصلي نسخه کاروي.

راځئ چې لومړی په POSIX کې تشریح شوي د کارونکي یوټیلټي کرونټاب سره آشنا شو ، له هغې وروسته به موږ په ویکسی کرون کې چمتو شوي ترکیب توسیعونه او په مشهور لینکس توزیع کې د ویکسی کرون تغیراتو کارول وګورو. او په نهایت کې ، په کیک کې چیری د کرون ډیمون وسیلې تحلیل دی.

د POSIX کرونټاب

که اصلي کرون تل د سوپر یوزر لپاره کار کړی وي، عصري مهال ویشونکي اکثرا د عادي کاروونکو دندو سره معامله کوي، کوم چې ډیر خوندي او اسانه وي.

کرون د دوه برنامو سیټ په توګه چمتو کیږي: په دوامداره توګه روان کرون ډیمون او د کرونټاب یوټیلیټ کاروونکو ته شتون لري. وروستی تاسو ته اجازه درکوي په سیسټم کې د هر کارونکي لپاره ځانګړي کاري جدولونه ایډیټ کړئ ، پداسې حال کې چې ډیمون د کارونکي او سیسټم میزونو څخه دندې پیلوي.

В د POSIX معیاري د ډیمون چلند په هیڅ ډول نه دی بیان شوی او یوازې د کارونکي برنامه رسمي کیږي crontab. د کاروونکي دندو د پیل کولو لپاره د میکانیزم شتون، البته، ضمیمه دی، مګر په تفصیل سره بیان شوی نه دی.

د کرونټاب یوټیلیټ په زنګ وهلو سره، تاسو کولی شئ څلور شیان ترسره کړئ: په مدیر کې د کارونکي ټاسک جدول ایډیټ کړئ، میز له فایل څخه پورته کړئ، اوسنی کاري میز وښایاست، او د کاري میز پاک کړئ. د کرونټاب افادیت څنګه کار کوي مثالونه:

crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файла

کله چې ویل کیږي crontab -e د معیاري چاپیریال متغیر کې مشخص شوی مدیر به وکارول شي 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 پدې اړه هیڅ نه وايي چې د دې متغیرونو ارزښتونه له کوم ځای څخه راځي.

غوره پلورونکی - ویکسی کرون 3.0pl1

د مشهور کرون ډولونو مشترک پلرونه Vixie cron 3.0pl1 دی، چې په 1992 کې د comp.sources.unix میلینګ لیست کې معرفي شوی. موږ به د دې نسخې اصلي ځانګړتیاوې په تفصیل سره په پام کې ونیسو.

ویکسی کرون په دوه برنامو کې راځي (کرون او کرونټاب). د معمول په څیر ، ډیمون د سیسټم ټاسک جدول او انفرادي کارونکي ټاسک جدولونو څخه د دندو لوستلو او چلولو مسؤلیت لري ، او د کرونټاب یوټیلیټ د کارن میزونو ترمیم لپاره مسؤل دی.

د کاري میز او ترتیب کولو فایلونه

د سوپر یوزر کاري جدول په /etc/crontab کې موقعیت لري. د سیسټم جدول ترکیب د ویکسی کرون ترکیب سره مطابقت لري ، پرته لدې چې په دې کې شپږم کالم د هغه کارونکي نوم په ګوته کوي چې د هغه لاندې دنده پیل شوې:

# Запускается ежеминутно от пользователя vlad
* * * * * vlad /path/to/exec

د کارونکي منظم کاري میزونه په /var/cron/tabs/username کې موقعیت لري او ورته ترکیب کاروي. کله چې تاسو د کارن په توګه د کرونټاب افادیت پرمخ وړئ، دا هغه فایلونه دي چې ایډیټ شوي.

د هغو کاروونکو لیستونه چې کرونټاب ته لاسرسی لري په /var/cron/allow او /var/cron/deny فایلونو کې اداره کیږي، چیرې چې تاسو اړتیا لرئ په جلا کرښه کې د کارونکي نوم داخل کړئ.

پراخ شوی نحو

د POSIX کرونټاب په پرتله، د پاول ویکسی حل د یوټیلټي کاري جدولونو ترکیب کې ډیری ګټور بدلونونه لري.

یو نوی جدول ترکیب موجود دی: د بیلګې په توګه، تاسو کولی شئ د اونۍ یا میاشتې ورځې د نوم په واسطه مشخص کړئ (دوشنبه، سه شنبه، او داسې نور):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * 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

د دندې اجرا کولو چاپیریال

ویکسی کرون تاسو ته اجازه درکوي د چلولو غوښتنلیکونو چاپیریال بدل کړئ.

د چاپیریال تغیرات USER, LOGNAME او HOME په ساده ډول د ډیمون لخوا ندي چمتو شوي بلکه د فایل څخه اخیستل شوي پاسورډ. د PATH متغیر "/usr/bin:/bin" ته ټاکل شوی او د شیل متغیر "/bin/sh" ته ټاکل شوی. د LOGNAME پرته د ټولو متغیرونو ارزښتونه د کارونکي جدولونو کې بدلیدلی شي.

د چاپیریال ځینې تغیرات (په ځانګړې توګه د شیل او کور) د دندې پرمخ وړلو لپاره پخپله د کرون لخوا کارول کیږي. دلته هغه څه دي چې د دودیز کارونو پرمخ وړلو لپاره د معیاري sh پرځای bash کارول ممکن داسې ښکاري:

SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/exec

په نهایت کې ، ټول چاپیریال متغیرونه چې په جدول کې تعریف شوي (د کرون لخوا کارول کیږي یا د پروسې لخوا ورته اړتیا وي) به روان کار ته لیږدول کیږي.

د فایلونو ایډیټ کولو لپاره ، کرونټاب د VISUAL یا EDITOR چاپیریال متغیر کې مشخص شوی مدیر کاروي. که چیرې هغه چاپیریال چیرې چې کرونټاب چلول شوی وي دا متغیرات نه وي تعریف شوي، نو "/usr/ucb/vi" کارول کیږي (ucb شاید د کالیفورنیا پوهنتون، برکلي وي).

کرون په دیبیان او اوبنټو کې

د دبیان او مشتق توزیع پراختیا کونکي خپاره کړي خورا بدل شوی نسخه د ویکسی کرون نسخه 3.0pl1. د جدول فایلونو ترکیب کې هیڅ توپیر شتون نلري؛ د کاروونکو لپاره دا ورته ویکسی کرون دی. ترټولو لوی نوی خصوصیت: ملاتړ سیسلاګ, SELinux и PAM.

لږ د پام وړ، مګر د پام وړ بدلونونه د ترتیب کولو فایلونو موقعیت او کاري میزونه شامل دي.

په دیبیان کې د کاروونکي میزونه په /var/sool/cron/crontabs لارښود کې موقعیت لري، د سیسټم میز لاهم شتون لري - په /etc/crontab. د ډیبیان بسته ځانګړي کاري میزونه په /etc/cron.d کې ایښودل شوي ، له هغه ځایه چې کرون ډیمون په اوتومات ډول لوستل کوي. د کارن لاسرسي کنټرول د /etc/cron.allow او /etc/cron.deny فایلونو لخوا کنټرول کیږي.

ډیفالټ شیل لاهم /bin/sh دی ، کوم چې په دیبیان کې د POSIX سره مطابقت لرونکی شیل دی ډش، پرته له کوم ترتیب لوستلو پیل شو (په غیر متقابل حالت کې).

کرون پخپله د Debian په وروستي نسخو کې د سیسټمډ له لارې پیل شوی، او د لانچ ترتیب په /lib/systemd/system/cron.service کې لیدل کیدی شي. د خدماتو په ترتیب کې هیڅ ځانګړی شتون نلري؛ د هر کارونکي په کرونټاب کې مستقیم اعلان شوي د چاپیریال متغیرونو له لارې نور فرعي دندې مدیریت ترسره کیدی شي.

cronie په RedHat، Fedora او CentOS کې

کروني - د ویکسی کرون نسخه 4.1 فورک. لکه څنګه چې په دیبیان کې ، ترکیب نه دی بدل شوی ، مګر د PAM او SELinux لپاره ملاتړ ، په کلستر کې کار کول ، د inotify په کارولو سره د فایلونو تعقیب او نور ب featuresې اضافه شوي.

ډیفالټ ترتیب په معمول ځایونو کې دی: د سیسټم میز په /etc/crontab کې دی، کڅوړې خپل میزونه په /etc/cron.d کې اچوي، د کاروونکي میزونه /var/spool/cron/crontabs کې ځي.

ډیمون د سیسټم کنټرول لاندې پرمخ ځي، د خدماتو ترتیب /lib/systemd/system/crond.service دی.

د Red Hat په څیر ویشونو کې، /bin/sh په پیل کې د ډیفالټ لخوا کارول کیږي، کوم چې معیاري باش دی. دا باید په یاد ولرئ چې کله چې د /bin/sh له لارې د کرون دندې پرمخ وړئ، د باش شیل د POSIX-compliant حالت کې پیل کیږي او هیڅ اضافي ترتیب نه لوستل کیږي، په غیر متقابل حالت کې پرمخ ځي.

cronie په SLES او openSUSE کې

د آلمان توزیع SLES او د هغې مشتق OpenSUSE ورته کرونی کاروي. ډیمون دلته هم د systemd لاندې پیل شوی، د خدماتو ترتیب په /usr/lib/systemd/system/cron.service کې موقعیت لري. ترتیب: /etc/crontab، /etc/cron.d، /var/spool/cron/tabs. /bin/sh هماغه باش دی چې په POSIX-compliant غیر متقابل حالت کې روان دی.

د ویکسی کرون وسیله

د کرون عصري اولادونه د ویکسی کرون په پرتله په بنسټیز ډول نه دي بدل شوي، مګر بیا هم نوي ځانګړتیاوې ترلاسه کړي چې د پروګرام اصولو پوهیدو ته اړتیا نلري. ډیری دا توسیعونه په خراب ډول ډیزاین شوي او کوډ ګډوډوي. د پاول ویکسی لخوا د کرون اصلي سرچینې کوډ لوستل یې خوښ دي.

له همدې امله ، ما پریکړه وکړه چې د کرون وسیلې تحلیل کړم د کرون برنامې مثال په کارولو سره چې د پراختیا دواړو څانګو ته عام دی - Vixie cron 3.0pl1. زه به د ifdefs په لرې کولو سره مثالونه ساده کړم چې لوستل یې پیچلي کوي او کوچني توضیحات پریږدي.

د شیطان کار په څو مرحلو ویشل کیدی شي:

  1. د پروګرام پیل کول.
  2. د چلولو لپاره د دندو لیست راټولول او تازه کول.
  3. اصلي کرون لوپ چلول.
  4. یو کار پیل کړئ.

راځئ چې دوی په ترتیب سره وګورو.

پیل کول

کله چې پیل شو، د پروسې دلیلونو چک کولو وروسته، کرون د SIGCHLD او SIGHUP سیګنال سمبالونکي نصبوي. لومړی د ماشوم پروسې پای ته رسیدو په اړه لاګ ننوتنه کوي ، دوهم یې د لاګ فایل فایل توضیح کونکی بندوي:

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

کرون ډیمون تل په سیسټم کې یوازې پرمخ ځي ، یوازې د سوپر یوزر په توګه او د اصلي کرون لارښود څخه. لاندې زنګونه د ډیمون پروسې PID سره د لاک فایل رامینځته کوي ، ډاډ ترلاسه کړئ چې کارن سم دی او اوسنی لارښود اصلي ته بدلوي:

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

ډیفالټ لاره جوړه شوې، کوم چې به د پروسې پیل کولو په وخت کې وکارول شي:

setenv("PATH", _PATH_DEFPATH, 1);

بیا پروسه "ډیمونیز" کیږي: دا د ماشوم پروسې کې د فورک او نوې سیشن (سیټسډ زنګ) په زنګ وهلو سره د پروسې ماشوم کاپي رامینځته کوي. د اصلي پروسې نور اړتیا نشته، او دا بهر کیږي:

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 فعالیت د دندو لیست پورته کولو مسولیت لري. دا د اصلي سیسټم کرونټاب او لارښود د کارونکي فایلونو سره ګوري. که فایلونه او لارښود بدل شوی نه وي، د دندې لیست بیا نه لوستل کیږي. که نه نو، د دندو یو نوی لیست جوړول پیل کیږي.

د ځانګړي فایل او میز نومونو سره د سیسټم فایل پورته کول:

/* если файл системной таблицы изменился, перечитываем */
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);
}

وروسته له دې چې زاړه ډیټابیس د نوي سره بدل شي.

په پورته مثالونو کې، د پروسې_کرونټاب فنکشن کال تاییدوي چې د میز فایل نوم سره سمون لرونکی یو کارن شتون لري (مګر دا یو سوپر یوزر وي) او بیا 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;
    }
}

دلته، یا د چاپیریال متغیر د load_env / env_set دندو په کارولو سره (د VAR = ارزښت د بڼې کرښې) تنظیم شوی، یا د دندې توضیحات لوستل کیږي (* * * * * /path/to/exec) د load_entry فنکشن په کارولو سره.

د ننوتلو اداره چې load_entry بیرته راګرځي زموږ دنده ده، کوم چې د دندو په عمومي لیست کې ځای پرځای شوي. فنکشن پخپله د وخت ب formatه فعل پارسینګ ترسره کوي ، مګر موږ د چاپیریال متغیرونو او د کار پیل کولو پیرامیټونو رامینځته کولو کې ډیر لیوالتیا لرو:

/* пользователь и группа для запуска задачи берутся из 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);

اصلي لوپ د دندو اوسني لیست سره کار کوي.

اصلي لوپ

د یونیکس 7 نسخه څخه اصلي کرون خورا ساده کار وکړ: دا په لوپ کې ترتیب له سره لوستل ، د سوپر یوزر په توګه د اوسني دقیقې دندې پیل کړې ، او د بلې دقیقې تر پیل پورې ویده شوې. په زړو ماشینونو کې دا ساده طریقه ډیری سرچینو ته اړتیا لري.

په SysV کې یو بدیل نسخه وړاندیز شوې وه، په کوم کې چې ډیمون تر هغه نږدې دقیقې پورې خوب ته ځي چې دنده یې ټاکل شوې وه، یا د 30 دقیقو لپاره. په دې حالت کې د تشکیلاتو د بیا لوستلو او دندو چک کولو لپاره لږې سرچینې مصرف شوي، مګر د دندو لیست په چټکۍ سره تازه کول ناشونی و.

ویکسی کرون په دقیقه کې یو ځل د دندو لیستونو چک کولو ته راستون شو، خوشبختانه د 80s په پای کې په معیاري یونیکس ماشینونو کې د پام وړ ډیرې سرچینې وې:

/* первичная загрузка задач */
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;
}

دا اساسا ټول کرون دی. ما ځینې په زړه پورې توضیحات پریښودل، د بیلګې په توګه، د لیرې کاروونکو حساب کول، مګر ما اصلي شی بیان کړ.

وروسته

کرون د حیرانتیا وړ ساده او ګټور برنامه ده چې د یونیکس نړۍ غوره دودونو کې رامینځته شوې. هغه نور څه نه کوي، مګر هغه د څو لسیزو راهیسې په حیرانتیا سره خپله دنده ترسره کوي. د هغه نسخې لپاره کوډ ترلاسه کول چې د اوبنټو سره راځي له یو ساعت څخه ډیر وخت نه و اخیستی ، او ما ډیر ساتیري درلوده! زه هیله لرم چې زه یې له تاسو سره شریک کړم.

زه ستاسو په اړه نه پوهیږم، مګر زه یو څه خفه یم چې پوه شوم چې عصري برنامه کول، د ډیر پیچلي او ډیر لنډیز کولو تمایل سره، د اوږدې مودې لپاره د داسې سادگي لپاره مناسب نه و.

د کرون لپاره ډیری عصري بدیلونه شتون لري: سیسټمډ ټایمر تاسو ته اجازه درکوي پیچلي سیسټمونه د انحصار سره تنظیم کړئ ، fcron تاسو ته اجازه درکوي په ډیر انعطاف سره د دندو لخوا د سرچینو مصرف تنظیم کړئ. مګر په شخصي توګه، ساده کرونټاب تل زما لپاره کافي و.

په لنډه توګه، د یونکس سره مینه وکړئ، ساده پروګرامونه وکاروئ او د خپل پلیټ فارم لپاره مینه لوستل مه هیروئ!

سرچینه: www.habr.com

Add a comment