لينڪس ۾ ڪرون: تاريخ، استعمال ۽ ڊوائيس

لينڪس ۾ ڪرون: تاريخ، استعمال ۽ ڊوائيس

ڪلاسيڪل لکيو آهي ته خوش ڪلاڪ نه ڏسندا آهن. انهن جهنگلي وقتن ۾ نه پروگرامر هئا ۽ نه ئي يونڪس، پر اڄ پروگرامر يقينن ڄاڻن ٿا: ڪرون انهن جي بدران وقت جي نگراني ڪندو.

ڪمانڊ لائن افاديتون ٻئي ڪمزوري ۽ ڪم مون لاءِ آهن. sed، awk، wc، cut ۽ ٻيا پراڻا پروگرام هر روز اسان جي سرور تي اسڪرپٽ ذريعي هلندا آهن. انھن مان گھڻا ٺاھيا ويا آھن ڪرون لاءِ ڪمن لاءِ، ھڪ شيڊيولر اصل ۾ 70s کان.

هڪ ڊگهي وقت تائين مون تفصيل ۾ وڃڻ جي بغير، سطحي طور تي ڪرون استعمال ڪيو، پر هڪ ڏينهن، جڏهن مون کي اسڪرپٽ هلائڻ دوران هڪ غلطي پيش آئي، مون ان کي چڱي طرح ڏسڻ جو فيصلو ڪيو. هي مضمون ڪيئن ظاهر ٿيو، جڏهن ته ان کي لکڻ دوران مان واقف ٿيس POSIX ڪرنٽاب، مشهور لينڪس ڊسٽريبيوشن ۾ مکيه ڪرون آپشنز ۽ انهن مان ڪجهه جي جوڙجڪ.

ڇا توهان لينڪس استعمال ڪري رهيا آهيو ۽ ڪرون ڪم هلائي رهيا آهيو؟ ڇا توهان يونڪس ۾ سسٽم ايپليڪيشن آرڪيٽيڪچر ۾ دلچسپي وٺندا آهيو؟ پوء اسان جي رستي تي آهيون!

Contents

ذات جو اصل

صارف يا سسٽم پروگرامن جي وقتي عمل سڀني آپريٽنگ سسٽم ۾ هڪ واضح ضرورت آهي. تنهن ڪري، پروگرامرز انهن خدمتن جي ضرورت کي محسوس ڪيو جيڪي انهن کي مرڪزي طور تي منصوبابندي ڪرڻ ۽ ڪم ڪرڻ جي اجازت ڏين ٿا هڪ ڊگهو وقت اڳ.

يونڪس جهڙو آپريٽنگ سسٽم پنهنجي اصليت کي واپس ورشن 7 يونڪس ڏانهن ڇڪي ٿو، جيڪو گذريل صديءَ جي 70 واري ڏهاڪي ۾ بيل ليبز ۾ تيار ڪيو ويو، جنهن ۾ مشهور ڪين ٿامپسن به شامل آهي. نسخو 7 يونڪس ۾ پڻ شامل آهي ڪرن، هڪ خدمت باقاعده هلائڻ لاءِ سپر يوزر ڪمن لاءِ.

هڪ عام جديد ڪرون هڪ سادي پروگرام آهي، پر اصل ورزن جو آپريٽنگ الگورٿم اڃا به آسان هو: سروس هڪ منٽ ۾ هڪ ڀيرو اٿندي آهي، هڪ واحد فائل (/etc/lib/crontab) جي ڪمن سان گڏ ٽيبل پڙهو ۽ ان لاءِ پرفارم ڪيو. superuser اهي ڪم جيڪي موجوده وقت ۾ ٿيڻ گهرجن ها.

تنهن کان پوء، سادي ۽ ڪارائتو خدمت جا بهتر ورزن سڀني يونڪس جهڙو آپريٽنگ سسٽم سان فراهم ڪيا ويا.

ڪرونٽاب فارميٽ جي عام وضاحت ۽ يوٽيلٽي جي آپريشن جا بنيادي اصول 1992 ۾ يونڪس جهڙو آپريٽنگ سسٽم - POSIX - جي بنيادي معيار ۾ شامل ڪيا ويا، ۽ اهڙيءَ طرح ڪرون هڪ حقيقي معيار مان هڪ حقيقي معيار بڻجي ويو.

1987 ۾، پال ويڪسي، سروي ڪندي يونڪس استعمال ڪندڙن کي سندن خواهشن جي باري ۾ ڪرون، ڊيمن جو هڪ ٻيو نسخو جاري ڪيو جنهن روايتي ڪرن جي ڪجهه مسئلن کي درست ڪيو ۽ ٽيبل فائلن جي نحو کي وڌايو.

Vixie cron جو ٽيون نسخو POSIX گهرجن کي پورو ڪرڻ شروع ڪيو، ان کان علاوه، پروگرام هڪ لبرل لائسنس هو، يا بلڪه ڪو به لائسنس نه هو، سواء README ۾ خواهش جي: ليکڪ ضمانت نه ڏيندو آهي، ليکڪ جو نالو ختم نه ٿي ڪري سگھجي، ۽ پروگرام صرف ماخذ ڪوڊ سان گڏ وڪرو ڪري سگھجي ٿو. اهي گهرجون مفت سافٽ ويئر جي اصولن سان مطابقت رکن ٿيون جيڪي انهن سالن ۾ مقبوليت حاصل ڪري رهيون هيون، تنهن ڪري ڪجهه اهم لينڪس ڊويزنون جيڪي 90 جي شروعات ۾ ظاهر ٿيا انهن مان وڪسي ڪرون کي پنهنجو سسٽم هڪ طور ورتو ۽ اڄ به ان کي ترقي ڪري رهيا آهن.

خاص طور تي، Red Hat ۽ SUSE Vixie cron - cronie جو هڪ ڪانٽو ٺاهي، ۽ Debian ۽ Ubuntu Vixie cron جو اصل ايڊيشن ڪيترن ئي پيچن سان استعمال ڪن ٿا.

اچو ته پهريان POSIX ۾ بيان ڪيل يوزر يوٽيلٽي ڪرنٽاب کان واقف ٿي وڃون، جنهن کان پوءِ اسان ويڪسي ڪرون ۾ مهيا ڪيل نحوي واڌارن ۽ مشهور لينڪس ڊسٽريبيوشنز ۾ ويڪسي ڪرون جي مختلف قسمن جي استعمال کي ڏسنداسين. ۽ آخرڪار، ڪيڪ تي چيري ڪرون ڊيمون ڊوائيس جو تجزيو آهي.

POSIX ڪرنٽاب

جيڪڏهن اصل ڪرون هميشه سپر يوزر لاءِ ڪم ڪيو، جديد شيڊيولر اڪثر عام استعمال ڪندڙن جي ڪمن سان ڊيل ڪندا آهن، جيڪو وڌيڪ محفوظ ۽ آسان هوندو آهي.

Crons ٻن پروگرامن جي هڪ سيٽ جي طور تي فراهم ڪيا ويا آهن: مسلسل هلندڙ ڪرون ڊيمون ۽ ڪرنٽاب يوٽيلٽي صارفين لاءِ دستياب آهي. بعد ۾ توهان کي سسٽم ۾ هر صارف لاء مخصوص ٽاسڪ جدولن کي تبديل ڪرڻ جي اجازت ڏئي ٿي، جڏهن ته ڊيمون صارف ۽ سسٽم جي جدولن مان ڪم شروع ڪري ٿو.

В POSIX معيار ڊيمن جي رويي کي ڪنهن به طريقي سان بيان نه ڪيو ويو آهي ۽ صرف صارف پروگرام کي رسمي ڪيو ويو آهي ٽرانسڪٽر. صارف جي ڪمن کي شروع ڪرڻ لاء ميڪانيزم جو وجود، يقينا، تقاضا آهي، پر تفصيل سان بيان نه ڪيو ويو آهي.

ڪرنٽاب يوٽيلٽي کي ڪال ڪندي، توهان چار شيون ڪري سگهو ٿا: ايڊيٽر ۾ يوزر جي ٽاسڪ ٽيبل کي ايڊٽ ڪريو، ٽيبل کي فائيل مان لوڊ ڪريو، موجوده ٽاسڪ ٽيبل ڏيکاريو، ۽ ٽاسڪ ٽيبل صاف ڪريو. مثال ڪيئن ڪرونٽاب افاديت ڪم ڪري ٿي:

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. HOME - استعمال ڪندڙ جي گھر ڊاريڪٽري.
  2. LOGNAME — يوزر لاگ ان.
  3. PATH اھو رستو آھي جتي توھان ڳولي سگھوٿا معياري سسٽم افاديت.
  4. شيل - استعمال ٿيل ڪمانڊ مترجم ڏانهن رستو.

خاص طور تي، POSIX ڪجھ به نه ٿو چوي ته انهن متغيرن جا قدر ڪٿان اچن ٿا.

بهترين وڪرو ڪندڙ - Vixie cron 3.0pl1

مشهور ڪرون مختلف قسمن جو عام اباڻو Vixie cron 3.0pl1 آهي، جيڪو 1992 ۾ comp.sources.unix ميلنگ لسٽ ۾ متعارف ڪرايو ويو. اسان هن نسخي جي مکيه خاصيتن تي وڌيڪ تفصيل سان غور ڪنداسين.

Vixie cron ٻن پروگرامن ۾ اچي ٿو (cron ۽ crontab). هميشه وانگر، ڊيمون سسٽم ٽاسڪ ٽيبل ۽ انفرادي صارف ٽاسڪ ٽيبل مان ڪم پڙهڻ ۽ هلائڻ جو ذميوار آهي، ۽ ڪرنٽاب يوٽيلٽي صارف جي جدولن کي ايڊٽ ڪرڻ جو ذميوار آهي.

ٽاسڪ ٽيبل ۽ ترتيب ڏيڻ واريون فائلون

سپر يوزر ٽاسڪ ٽيبل ۾ واقع آهي /etc/crontab. سسٽم ٽيبل جو نحو ويڪسي ڪرون جي نحو سان ملندو آهي، استثنا سان ته ان ۾ ڇهين ڪالم صارف جو نالو ظاهر ڪري ٿو جنهن جي تحت ڪم شروع ڪيو ويو آهي:

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

باقاعده يوزر ٽاسڪ ٽيبل /var/cron/tabs/username ۾ واقع آهن ۽ ساڳي نحو استعمال ڪريو. جڏهن توهان هلائيندا آهيو crontab افاديت هڪ صارف جي طور تي، اهي فائلون آهن جيڪي ايڊٽ ٿيل آهن.

استعمال ڪندڙن جون لسٽون جيڪي crontab تائين پهچن ٿيون انهن کي منظم ڪيو ويو آهي /var/cron/allow ۽ /var/cron/deny فائلن ۾، جتي توهان کي صرف هڪ الڳ لائن ۾ صارف جو نالو داخل ڪرڻ جي ضرورت آهي.

وڌايل نحو

POSIX ڪرنٽاب جي مقابلي ۾، پال ويڪسي جو حل يوٽيلٽي جي ٽاسڪ ٽيبل جي نحو ۾ ڪيتريون ئي مفيد تبديليون شامل آهن.

ھڪڙو نئون جدول نحو دستياب ٿي چڪو آھي: مثال طور، توھان بيان ڪري سگھو ٿا ھفتي جا ڏينھن يا مھينن جي نالي سان (Mon, Tue, and so on):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * 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 صرف ڊيمن پاران مهيا ڪيل نه آهن، پر هڪ فائل مان ورتا ويا آهن. گذريو. 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 شايد ڪيليفورنيا يونيورسٽي، برڪلي آهي).

ڪرون ڊيبين ۽ Ubuntu تي

ڊولپرز ڊبيان ۽ ڊيريوٽيوٽ ڊسٽريبيوشنز جاري ڪيا آھن انتهائي تبديل ٿيل نسخو ويڪسي ڪرون ورزن 3.0pl1. ٽيبل فائلن جي نحو ۾ ڪو به فرق نه آهي؛ صارفين لاء اهو ساڳيو آهي Vixie cron. سڀ کان وڏو نئون فيچر: سپورٽ syslog, SELinux и PAM.

گهٽ قابل ذڪر، پر واضح تبديلين ۾ شامل آهن ترتيب واري فائلن جو مقام ۽ ٽاسڪ ٽيبل.

ديبين ۾ استعمال ڪندڙ ٽيبل /var/spool/cron/crontabs ڊاريڪٽري ۾ واقع آهن، سسٽم ٽيبل اڃا تائين موجود آهي - /etc/crontab ۾. ديبين پيڪيج لاءِ مخصوص ٽاسڪ ٽيبل /etc/cron.d ۾ رکيا ويا آهن، جتان ڪرون ڊيمون پاڻمرادو انهن کي پڙهي ٿو. استعمال ڪندڙ جي رسائي ڪنٽرول /etc/cron.allow ۽ /etc/cron.deny فائلن جي ذريعي ڪنٽرول آهي.

ڊفالٽ شيل اڃا تائين آهي /bin/sh، جيڪو ديبين ۾ هڪ ننڍڙو POSIX-compliant شيل آهي. ڊش، بغير ڪنهن ترتيب جي پڙهڻ کان سواءِ شروع ڪيو (غير انٽرايڪٽو موڊ ۾).

ڪرون پاڻ ڊيبين جي جديد ورزن ۾ سسٽم ڊي ذريعي شروع ڪيو ويو آهي، ۽ لانچ جي ترتيب کي ڏسي سگھجي ٿو /lib/systemd/system/cron.service. خدمت جي ترتيب ۾ ڪجھ به خاص نه آهي؛ ڪو به وڌيڪ ذيلي ڪم انتظام ماحول جي متغير ذريعي ڪري سگهجي ٿو جيڪو سڌو سنئون هر صارف جي ڪرنٽاب ۾ اعلان ڪيو ويو آهي.

cronie تي RedHat، Fedora ۽ CentOS

سري لنڪا - ويڪسي ڪرون ورزن 4.1 جو ڪانٽو. جيئن ڊيبين ۾، نحو تبديل نه ڪيو ويو آهي، پر PAM ۽ SELinux لاءِ سپورٽ، ڪلستر ۾ ڪم ڪرڻ، فائلن کي ٽريڪ ڪندي inotify ۽ ٻيون خاصيتون شامل ڪيون ويون آهن.

ڊفالٽ ٺاھ جوڙ عام جڳهن ۾ آھي: سسٽم ٽيبل /etc/crontab ۾ آھي، پيڪيجز پنھنجي جدولن کي /etc/cron.d ۾ رکندا آھن، استعمال ڪندڙ ٽيبل /var/spool/cron/crontabs ۾ ويندا آھن.

ڊيمون سسٽم جي ڪنٽرول هيٺ هلندو آهي، خدمت جي ترتيب /lib/systemd/system/crond.service آهي.

Red Hat-جهڙي تقسيم تي، /bin/sh شروعاتي طور تي ڊفالٽ طور استعمال ڪيو ويندو آھي، جيڪو معياري بش آھي. اهو ياد رکڻ گهرجي ته جڏهن /bin/sh ذريعي ڪرون نوڪريون هلائي رهيا آهن، بش شيل POSIX-مطابقت واري موڊ ۾ شروع ٿئي ٿو ۽ غير انٽرايڪٽو موڊ ۾ هلندڙ اضافي ڪا به ترتيب نه پڙهي.

SLES ۽ openSUSE ۾ cronie

جرمن تقسيم SLES ۽ ان جو نڪتل OpenSUSE ساڳيو ڪروني استعمال ڪن ٿا. ڊيمن هتي پڻ سسٽم ڊي جي تحت شروع ڪيو ويو آهي، سروس جي جوڙجڪ /usr/lib/systemd/system/cron.service ۾ واقع آهي. ٺاھ جوڙ: /etc/crontab، /etc/cron.d، /var/spool/cron/tabs. /bin/sh ساڳيو بيش آهي جيڪو POSIX-compliant غير انٽرايڪٽو موڊ ۾ هلندو آهي.

ويڪسي ڪرون ڊوائيس

ڪرون جي جديد اولاد Vixie cron جي مقابلي ۾ بنيادي طور تي تبديل نه ٿيا آهن، پر اڃا تائين نيون خاصيتون حاصل ڪيون آهن جيڪي پروگرام جي اصولن کي سمجهڻ جي ضرورت ناهي. انهن مان ڪيتريون ئي واڌايون خراب ٺهيل آهن ۽ ڪوڊ کي پريشان ڪن ٿيون. پال ويڪسي جو اصل ڪرون سورس ڪوڊ پڙهڻ لاءِ خوشي آهي.

تنهن ڪري، مون فيصلو ڪيو ته ڪرن ڊيوائس جو تجزيو ڪرڻ جو مثال استعمال ڪندي ڪرون پروگرام جو مثال ترقي جي ٻنهي شاخن لاءِ عام آهي - 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);
}

جنهن کان پوءِ پراڻي ڊيٽابيس کي نئين سان تبديل ڪيو ويندو.

مٿين مثالن ۾، 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 = قدر) 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);

مکيه لوپ ڪمن جي موجوده فهرست سان ڪم ڪري ٿو.

مکيه لوپ

نسخو 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;
}

چائلڊ_پروسيس ۾ ڪافي منطق آهي: اهو معياري آئوٽ پٽ ۽ ايرر اسٽريمز کي قبول ڪري ٿو، پوءِ انهن کي ميل ڏانهن موڪلي ٿو (جيڪڏهن 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;
}

اهو بنيادي طور تي تمام ڪرون آهي. مون ڪجھ دلچسپ تفصيلن کي ختم ڪيو، مثال طور، ريموٽ استعمال ڪندڙن لاء اڪائونٽنگ، پر مون بنيادي شيء کي بيان ڪيو.

پوء

ڪرون هڪ حيرت انگيز سادو ۽ مفيد پروگرام آهي، جيڪو يونڪس دنيا جي بهترين روايتن ۾ ٺاهيو ويو آهي. هوءَ ڪجهه به اضافي نه ڪندي آهي، پر هوءَ ڪيترن ئي ڏهاڪن کان پنهنجو ڪم شاندار نموني ڪري رهي آهي. Ubuntu سان گڏ اچڻ واري نسخي لاءِ ڪوڊ حاصل ڪرڻ ۾ هڪ ڪلاڪ کان وڌيڪ نه ورتو ويو، ۽ مون کي ڏاڍو مزو آيو! مون کي اميد آهي ته مان ان کي توهان سان حصيداري ڪرڻ جي قابل هو.

مان توهان جي باري ۾ نه ٿو ڄاڻان، پر مون کي اهو احساس ڪرڻ لاء ٿورو اداس آهي ته جديد پروگرامنگ، ان جي وڌيڪ پيچيدگي ۽ وڌيڪ تجريد جي رجحان سان، هڪ ڊگهي وقت تائين اهڙي سادگي لاء سازگار نه آهي.

ڪرون جا ڪيترائي جديد متبادل آھن: سسٽمڊ ٽائمر توھان کي اجازت ڏين ٿا پيچيده نظامن کي منظم ڪرڻ جي انحصار سان، fcron توھان کي اجازت ڏئي ٿو وڌيڪ لچڪدار طريقي سان وسيلن جي استعمال کي ڪمن ذريعي منظم ڪرڻ. پر ذاتي طور تي، آسان ترين ڪرنٽاب هميشه مون لاء ڪافي هو.

مختصر ۾، يونڪس سان پيار ڪريو، سادو پروگرام استعمال ڪريو ۽ پنھنجي پليٽ فارم لاءِ ماني پڙھڻ نه وساريو!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو