لینکس میں کرون: تاریخ، استعمال اور آلہ

لینکس میں کرون: تاریخ، استعمال اور آلہ

کلاسک نے لکھا کہ خوشی کے اوقات نہیں دیکھتے۔ ان جنگلی زمانے میں نہ تو پروگرامر تھے اور نہ ہی یونکس، لیکن آج پروگرامرز یقینی طور پر جانتے ہیں: کرون ان کے بجائے وقت پر نظر رکھے گا۔

کمانڈ لائن کی افادیت میرے لئے ایک کمزوری اور کام کاج دونوں ہیں۔ sed، awk، wc، cut اور دیگر پرانے پروگرام ہر روز ہمارے سرورز پر اسکرپٹ کے ذریعے چلائے جاتے ہیں۔ ان میں سے بہت سے کرون کے کاموں کے طور پر ڈیزائن کیے گئے ہیں، جو کہ اصل میں 70 کی دہائی سے ایک شیڈولر ہے۔

ایک طویل عرصے تک میں نے تفصیلات میں جانے کے بغیر، سطحی طور پر کرون کا استعمال کیا، لیکن ایک دن، جب اسکرپٹ چلاتے ہوئے مجھے غلطی کا سامنا کرنا پڑا، تو میں نے اسے اچھی طرح سے دیکھنے کا فیصلہ کیا۔ یہ مضمون اس طرح ظاہر ہوا، اسے لکھتے ہوئے میں POSIX crontab، مقبول لینکس ڈسٹری بیوشنز میں اہم کرون آپشنز اور ان میں سے کچھ کی ساخت سے واقف ہوا۔

کیا آپ لینکس استعمال کر رہے ہیں اور کرون ٹاسک چلا رہے ہیں؟ کیا آپ یونکس میں سسٹم ایپلیکیشن آرکیٹیکچر میں دلچسپی رکھتے ہیں؟ پھر ہم اپنے راستے پر ہیں!

مواد

پرجاتیوں کی اصل

تمام آپریٹنگ سسٹمز میں صارف یا سسٹم کے پروگراموں کی وقتاً فوقتاً عملدرآمد ایک واضح ضرورت ہے۔ لہذا، پروگرامرز نے خدمات کی ضرورت کو محسوس کیا جو انہیں مرکزی طور پر منصوبہ بندی کرنے اور کاموں کو ایک طویل عرصہ پہلے انجام دینے کی اجازت دیتے ہیں۔

یونکس نما آپریٹنگ سسٹم اپنی اصلیت کو ورژن 7 یونکس سے ڈھونڈتے ہیں، جسے پچھلی صدی کے 70 کی دہائی میں بیل لیبز میں تیار کیا گیا تھا، بشمول مشہور کین تھامسن نے۔ ورژن 7 یونکس میں کرون بھی شامل ہے، جو سپر یوزر کے کاموں کو باقاعدگی سے چلانے کے لیے ایک سروس ہے۔

ایک عام جدید کرون ایک سادہ پروگرام ہے، لیکن اصل ورژن کا آپریٹنگ الگورتھم اس سے بھی آسان تھا: سروس ایک منٹ میں ایک بار اٹھتی ہے، ایک فائل (/etc/lib/crontab) سے کاموں کے ساتھ ایک ٹیبل پڑھتی ہے اور اس کے لیے پرفارم کرتی ہے۔ سپر یوزر ان کاموں کو جو موجودہ وقت میں انجام دیا جانا چاہیے تھا۔

اس کے بعد، سادہ اور مفید سروس کے بہتر ورژن تمام یونکس جیسے آپریٹنگ سسٹم کے ساتھ فراہم کیے گئے۔

کرونٹاب فارمیٹ کی عمومی وضاحت اور یوٹیلیٹی کے آپریشن کے بنیادی اصولوں کو 1992 میں یونکس جیسے آپریٹنگ سسٹمز - POSIX - کے بنیادی معیار میں شامل کیا گیا تھا، اور اس طرح کرون ڈی فیکٹو اسٹینڈرڈ سے ایک ڈی جیور اسٹینڈرڈ بن گیا۔

1987 میں، پال وکسی نے، یونکس کے صارفین کو کرون کے لیے ان کی خواہشات کے بارے میں سروے کرنے کے بعد، ڈیمون کا ایک اور ورژن جاری کیا جس نے روایتی کرون کے کچھ مسائل کو درست کیا اور ٹیبل فائلوں کے نحو کو بڑھایا۔

Vixie cron کے تیسرے ورژن نے POSIX کی ضروریات کو پورا کرنا شروع کر دیا، اس کے علاوہ، پروگرام کے پاس ایک لبرل لائسنس تھا، یا یوں کہیں کہ کوئی لائسنس نہیں تھا، سوائے README میں خواہشات کے: مصنف گارنٹی نہیں دیتا، مصنف کا نام حذف نہیں کیا جا سکتا، اور پروگرام کو صرف سورس کوڈ کے ساتھ فروخت کیا جا سکتا ہے۔ یہ تقاضے مفت سافٹ ویئر کے اصولوں سے ہم آہنگ نکلے جو ان سالوں میں مقبولیت حاصل کر رہے تھے، لہذا 90 کی دہائی کے اوائل میں ظاہر ہونے والی کچھ اہم لینکس ڈسٹری بیوشنز نے Vixie cron کو اپنا سسٹم ایک کے طور پر لیا اور آج بھی اسے تیار کر رہے ہیں۔

خاص طور پر، Red Hat اور SUSE Vixie cron - cronie کا ایک فورک تیار کرتے ہیں، اور Debian اور Ubuntu بہت سے پیچ کے ساتھ Vixie cron کے اصل ایڈیشن کا استعمال کرتے ہیں۔

آئیے پہلے POSIX میں بیان کردہ یوزر یوٹیلیٹی کرونٹاب سے واقف ہوں، اس کے بعد ہم Vixie cron میں فراہم کردہ نحوی توسیعات اور مقبول لینکس ڈسٹری بیوشنز میں Vixie cron کی مختلف حالتوں کے استعمال کو دیکھیں گے۔ اور آخر میں، کیک پر چیری کرون ڈیمون ڈیوائس کا تجزیہ ہے۔

پوسکس کرونٹاب

اگر اصل کرون ہمیشہ سپر یوزر کے لیے کام کرتا ہے، تو جدید شیڈولرز اکثر عام صارفین کے کاموں سے نمٹتے ہیں، جو زیادہ محفوظ اور آسان ہے۔

کرون کو دو پروگراموں کے سیٹ کے طور پر فراہم کیا جاتا ہے: مسلسل چلنے والا کرون ڈیمون اور صارفین کے لیے دستیاب کرونٹاب یوٹیلیٹی۔ مؤخر الذکر آپ کو سسٹم میں ہر صارف کے لئے مخصوص ٹاسک ٹیبلز میں ترمیم کرنے کی اجازت دیتا ہے، جبکہ ڈیمون صارف اور سسٹم ٹیبلز سے کاموں کو شروع کرتا ہے۔

В 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 crontab کے مقابلے میں، Paul Vixey کے حل میں یوٹیلیٹی کے ٹاسک ٹیبلز کے نحو میں کئی بہت مفید ترمیمات شامل ہیں۔

ایک نیا ٹیبل نحو دستیاب ہو گیا ہے: مثال کے طور پر، آپ ہفتے کے دن یا مہینوں کو نام کے ساتھ بتا سکتے ہیں (پیر، منگل، وغیرہ):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * 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" پر سیٹ کیا گیا ہے اور SHELL متغیر کو "/bin/sh" پر سیٹ کیا گیا ہے۔ LOGNAME کے علاوہ تمام متغیرات کی قدروں کو صارف کی میزوں میں تبدیل کیا جا سکتا ہے۔

کچھ ماحولیاتی متغیرات (خاص طور پر شیل اور ہوم) کام کو چلانے کے لیے کرون خود استعمال کرتے ہیں۔ حسب ضرورت کاموں کو چلانے کے لیے معیاری sh کی بجائے bash کا استعمال اس طرح نظر آتا ہے:

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

بالآخر، ٹیبل میں بیان کردہ تمام ماحولیاتی متغیرات (کرون کے ذریعہ استعمال کیا جاتا ہے یا عمل کے ذریعہ درکار ہے) کو چلانے والے کام میں منتقل کردیا جائے گا۔

فائلوں میں ترمیم کرنے کے لیے، crontab VISUAL یا EDITOR ماحولیاتی متغیر میں مخصوص ایڈیٹر کا استعمال کرتا ہے۔ اگر وہ ماحول جہاں کرونٹاب چلایا گیا تھا اس میں ان متغیرات کی وضاحت نہیں ہے، تو پھر "/usr/ucb/vi" استعمال کیا جاتا ہے (ucb شاید یونیورسٹی آف کیلیفورنیا، برکلے ہے)۔

کرون ڈیبین اور اوبنٹو پر

ڈیبین اور ڈیریویٹیو ڈسٹری بیوشنز کے ڈویلپرز نے ریلیز کیا ہے۔ انتہائی ترمیم شدہ ورژن Vixie cron ورژن 3.0pl1۔ ٹیبل فائلوں کے نحو میں کوئی فرق نہیں ہے؛ صارفین کے لیے یہ وہی Vixie cron ہے۔ سب سے بڑی نئی خصوصیت: سپورٹ syslog, SELINUX и ڈبلیو ایف پی.

کم قابل توجہ، لیکن ٹھوس تبدیلیوں میں کنفیگریشن فائلز اور ٹاسک ٹیبلز کا مقام شامل ہے۔

Debian میں صارف کی میزیں /var/spool/cron/crontabs ڈائرکٹری میں موجود ہیں، سسٹم ٹیبل اب بھی موجود ہے - /etc/crontab میں۔ Debian پیکیج کے لیے مخصوص ٹاسک ٹیبلز /etc/cron.d میں رکھی گئی ہیں، جہاں سے کرون ڈیمون خود بخود انہیں پڑھتا ہے۔ صارف تک رسائی کا کنٹرول /etc/cron.allow اور /etc/cron.deny فائلوں کے ذریعے کنٹرول کیا جاتا ہے۔

پہلے سے طے شدہ شیل اب بھی /bin/sh ہے، جو ڈیبین میں ایک چھوٹا POSIX کے مطابق شیل ہے۔ ڈیش، بغیر کسی کنفیگریشن کو پڑھے لانچ کیا (غیر انٹرایکٹو موڈ میں)۔

ڈیبیان کے تازہ ترین ورژن میں کرون خود کو systemd کے ذریعے لانچ کیا گیا ہے، اور لانچ کنفیگریشن کو /lib/systemd/system/cron.service میں دیکھا جا سکتا ہے۔ سروس کنفیگریشن میں کوئی خاص چیز نہیں ہے؛ کوئی بھی زیادہ لطیف ٹاسک مینجمنٹ ہر صارف کے کرون ٹیب میں براہ راست اعلان کردہ ماحولیاتی تغیرات کے ذریعے کیا جا سکتا ہے۔

RedHat، Fedora اور CentOS پر cronie

کرونی - Vixie cron ورژن 4.1 کا فورک۔ جیسا کہ Debian میں، نحو تبدیل نہیں ہوا ہے، لیکن PAM اور SELinux کے لیے سپورٹ، ایک کلسٹر میں کام کرنا، inotify کا استعمال کرتے ہوئے فائلوں کو ٹریک کرنا اور دیگر خصوصیات شامل کی گئی ہیں۔

ڈیفالٹ کنفیگریشن معمول کی جگہوں پر ہے: سسٹم ٹیبل /etc/crontab میں ہے، پیکجز اپنی میزیں /etc/cron.d میں ڈالتے ہیں، صارف کی میزیں /var/spool/cron/crontabs میں جاتی ہیں۔

ڈیمون سسٹمڈ کنٹرول کے تحت چلتا ہے، سروس کنفیگریشن /lib/systemd/system/crond.service ہے۔

Red Hat کی طرح کی تقسیم پر، /bin/sh شروع میں بطور ڈیفالٹ استعمال ہوتا ہے، جو کہ معیاری bash ہے۔ واضح رہے کہ کرون جابز کو /bin/sh کے ذریعے چلاتے وقت، bash شیل POSIX-compliant موڈ میں شروع ہوتا ہے اور کوئی اضافی کنفیگریشن نہیں پڑھتا، نان انٹرایکٹو موڈ میں چلتا ہے۔

SLES اور اوپن سوس میں کرونی

جرمن ڈسٹری بیوشن SLES اور اس کے مشتق اوپن سوس ایک ہی کرونی کا استعمال کرتے ہیں۔ یہاں ڈیمون بھی systemd کے تحت شروع کیا گیا ہے، سروس کنفیگریشن /usr/lib/systemd/system/cron.service میں واقع ہے۔ کنفیگریشن: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs۔ /bin/sh وہی bash ہے جو 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;
    }
}

یہاں، load_env / env_set فنکشنز کا استعمال کرتے ہوئے یا تو ماحولیاتی متغیر سیٹ کیا جاتا ہے (فارم VAR=value کی لائنیں)، یا ٹاسک کی تفصیل پڑھی جاتی ہے (* * * * * /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 منٹ تک۔ اس موڈ میں کنفیگریشن کو دوبارہ پڑھنے اور کاموں کو چیک کرنے کے لیے کم وسائل استعمال کیے گئے، لیکن کاموں کی فہرست کو تیزی سے اپ ڈیٹ کرنا تکلیف دہ ہو گیا۔

Vixie cron ایک منٹ میں ایک بار کام کی فہرستوں کی جانچ پڑتال پر واپس آیا، خوش قسمتی سے 80 کی دہائی کے آخر تک معیاری یونکس مشینوں پر نمایاں طور پر زیادہ وسائل موجود تھے:

/* первичная загрузка задач */
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 کے ساتھ آنے والے ورژن کے کوڈ کو حاصل کرنے میں ایک گھنٹہ سے زیادہ وقت نہیں لگا، اور مجھے بہت مزہ آیا! مجھے امید ہے کہ میں آپ کے ساتھ اس کا اشتراک کرنے کے قابل تھا۔

میں آپ کے بارے میں نہیں جانتا، لیکن مجھے یہ جان کر تھوڑا دکھ ہوا کہ جدید پروگرامنگ، جس میں زیادہ پیچیدہ اور زیادہ تجریدی کے رجحان کے ساتھ، ایک طویل عرصے سے اس طرح کی سادگی کے لیے سازگار نہیں ہے۔

cron کے بہت سے جدید متبادل ہیں: systemd-timers آپ کو انحصار کے ساتھ پیچیدہ سسٹمز کو منظم کرنے کی اجازت دیتا ہے، fcron آپ کو کاموں کے ذریعے وسائل کے استعمال کو زیادہ لچکدار طریقے سے منظم کرنے کی اجازت دیتا ہے۔ لیکن ذاتی طور پر، سب سے آسان کرونٹاب ہمیشہ میرے لیے کافی تھا۔

مختصراً، یونکس سے محبت کریں، سادہ پروگرام استعمال کریں اور اپنے پلیٹ فارم کے لیے من کو پڑھنا نہ بھولیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں