EQVPS

VPS پر cron اور systemd ٹائمرز سے کام شیڈول کرنے کا طریقہ

بیک اپ، صفائی اور اسکرپٹس شیڈول کے مطابق چلائیں۔ پانچ منٹ میں cron اور وہ تین جال جو خاموشی سے کام بگاڑ دیتے ہیں، پھر لاگز، بندش کے بعد چھوٹے کام پورے کرنے اور درست وقت کے لیے systemd ٹائمرز۔ نیچے کا ہر رویہ نئے Ubuntu 24.04 سرور پر آزمایا گیا۔

سرور اپنی قیمت تب وصول کرتا ہے جب آپ کے سوتے وقت کام کرے: بیک اپ، لاگ روٹیشن، سرٹیفکیٹ کی تجدید، نو بجے رپورٹ۔ Linux میں اس کے لیے دو شیڈولر ہیں۔ cron چالیس سال پرانا ہے اور ایک لائن کافی ہے۔ systemd ٹائمرز کو دو چھوٹی فائلیں چاہییں، اور بدلے میں لاگز، بندش کے بعد چھوٹے رنز کی تلافی اور درست وقت ملتا ہے۔ یہ گائیڈ Ubuntu 24.04 پر دونوں کا احاطہ کرتی ہے، اور ہر رویہ ہماری امیج سے بنے نئے سرور پر جانچا گیا ہے، ان تین غلطیوں سمیت جن کی وجہ سے cron کا کام ایک لفظ کہے بغیر ناکام ہو جاتا ہے۔

آپ کو sudo والا یوزر چاہیے؛ Ubuntu سیٹ اپ گائیڈ ایک بناتی ہے۔

1. پانچ منٹ میں cron

cron ہماری Ubuntu اور Debian امیجز پر انسٹال ہے اور چل رہا ہے۔ ہر یوزر کی اپنی کاموں کی ٹیبل ہوتی ہے؛ اپنی ٹیبل اس سے ایڈٹ کریں:

crontab -e

ہر لائن پانچ وقت کے فیلڈز اور ایک کمانڈ ہے:

# min hour day month weekday  command
  30  3    *   *     *        /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
  */5 *    *   *     *        /usr/local/bin/check.sh
  0   9    *   *     1-5      /usr/local/bin/report.sh
  @reboot                     /usr/local/bin/start-tunnel.sh

یعنی: ہر رات 03:30 پر، ہر 5 منٹ بعد، کام کے دنوں میں 09:00 پر، اور ہر بوٹ کے بعد ایک بار۔ */5 کا مطلب ہر پانچویں قدر، 1-5 ایک رینج، 1,15 ایک فہرست۔ سرور کا ٹائم زون لاگو ہوتا ہے، ہماری امیجز پر UTC؛ اپنا زون ایک بار ہوسٹ نیم اور ٹائم زون گائیڈ سے سیٹ کریں اور cron اسی پر چلے گا۔

جو چلا اسے journalctl -u cron سے دیکھیں۔ ہر رن یوزر اور کمانڈ لاگ کرتا ہے، اور وہیں تینوں جال نظر آتے ہیں۔

جال 1: آؤٹ پٹ غائب ہو جاتا ہے۔ cron کام کا آؤٹ پٹ یوزر کو ای میل کرتا ہے۔ ہماری امیج میں میل سرور نہیں، اس لیے journal نے (CRON) info (No MTA installed, discarding output) دکھایا اور آؤٹ پٹ ضائع ہو گیا۔ اسے خود ری ڈائریکٹ کریں، جیسے پہلی مثال میں >> /var/log/backup.log 2>&1 سے کیا گیا۔

جال 2: فیصد کا نشان۔ crontab میں % کمانڈ ختم کر دیتا ہے اور باقی حصے کو اسٹینڈرڈ اِن پٹ بنا دیتا ہے۔ ہم نے date +%F > /tmp/today شیڈول کیا۔ journal دکھاتا ہے کہ cron نے اصل میں کیا چلایا: CMD (date +)۔ کوئی فائل نہیں بنی اور کوئی ایرر ہم تک نہیں پہنچا۔ \% لکھیں، یا کمانڈ کو اسکرپٹ میں رکھ کر اسکرپٹ شیڈول کریں۔

جال 3: مختلف ماحول۔ cron کام bash کے بجائے /bin/sh سے، آپ کے ہوم فولڈر میں اور محدود ماحول کے ساتھ چلاتا ہے۔ Ubuntu 24.04 پر PATH اپنی شہرت سے بہتر نکلا: /usr/local/bin اور /snap/bin سمیت مکمل سسٹم پاتھ، root اور عام یوزر دونوں کے لیے۔ جو اب بھی غائب ہے وہ ہوم فولڈر کے نیچے کی ہر چیز ہے: ~/.local/bin، nvm کا node، pipx اور cargo۔ کام میں مکمل راستے استعمال کریں یا لائن . $HOME/.profile; سے شروع کریں۔

جو کام یوزر کے بجائے سسٹم کے ہوں وہ /etc/cron.d/ میں فائل کی صورت رکھے جاتے ہیں، ایک اضافی فیلڈ یعنی یوزر کے ساتھ:

30 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Ubuntu /etc/cron.hourly، cron.daily، cron.weekly اور cron.monthly میں موجود ہر چیز بھی چلاتا ہے: ہر گھنٹے کے 17ویں منٹ پر، 06:25 پر، اتوار کو 06:47 پر اور مہینے کی پہلی تاریخ کو 06:52 پر۔ وہاں قابلِ اجرا اسکرپٹ رکھیں اور وہ باقیوں کے ساتھ چلے گا۔

2. systemd ٹائمرز

ٹائمر دو یونٹس ہیں: کام کرنے والی سروس اور وقت بتانے والا ٹائمر۔ پہلے اسکرپٹ بنائیں، پھر یونٹس۔

sudo nano /usr/local/bin/backup.sh
sudo chmod +x /usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Run the backup every night at 03:30

[Timer]
OnCalendar=*-*-* 03:30
Persistent=true
AccuracySec=1m

[Install]
WantedBy=timers.target

سروس نہیں، ٹائمر فعال کریں:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer

list-timers اگلا رن، اس میں باقی وقت اور آخری رن دکھاتا ہے۔ لاگز کو سیٹ اپ کی ضرورت نہیں: journalctl -u backup.service میں ہر آغاز، ہر اختتام اور آؤٹ پٹ کی ہر لائن وقت کے ساتھ موجود ہے۔ کام ابھی چلانے کے لیے sudo systemctl start backup.service؛ شیڈول پر بھروسا کرنے سے پہلے اسکرپٹ بھی اسی طرح آزمائیں۔

کیلنڈر کا نحو۔ OnCalendar یوں پڑھا جاتا ہے: ہفتے-کا-دن سال-مہینہ-دن گھنٹہ:منٹ:سیکنڈ، اور * کسی بھی قدر کے لیے۔ استعمال سے پہلے اظہار کو آزمائیں:

systemd-analyze calendar "Mon..Fri *-*-* 03:00" --iterations 2

یہ نارملائزڈ شکل اور اگلی تاریخیں پرنٹ کرتا ہے۔ کچھ اظہار جو ہم نے جانچے:

OnCalendarمطلب
*-*-* 03:30ہر دن 03:30 پر
Mon..Fri *-*-* 09:00کام کے دنوں میں 09:00 پر
*:0/15ہر 15 منٹ بعد
weeklyپیر کو 00:00 پر
*-*-01 04:00ہر مہینے کی پہلی تاریخ کو 04:00 پر
*-*-* 03:00 Europe/Kyivکیف کے وقت 03:00؛ ہمارے ٹیسٹ میں 01:00 UTC پر چلا

تین سیٹنگز جو جاننے کے لائق ہیں۔ Persistent=true آخری رن ڈسک پر محفوظ کرتا ہے اور وہ رن پورا کرتا ہے جو سرور بند رہنے یا ٹائمر رکے رہنے کے دوران چھوٹ گیا۔ ہم نے اپنا ہر دو منٹ والا ٹائمر روکا، ایک شیڈول رن گزرنے دیا اور اسے دوبارہ شروع کیا: چھوٹا ہوا رن اسی سیکنڈ میں چل پڑا۔ Persistent کے بغیر وہ بس اگلی باری کا انتظار کرتا ہے۔

AccuracySec اصل سرپرائز ہے۔ ڈیفالٹ طور پر systemd سسٹم کو کم جگانے کے لیے ٹائمرز کو ایک منٹ کی کھڑکی میں اکٹھا کرتا ہے، اسی لیے ہمارا پہلا رن 07:42:00 کے بجائے 07:42:18 پر آیا۔ AccuracySec=1s کے ساتھ اگلے رنز ٹھیک سیکنڈ پر 07:46:00 اور 07:48:00 پر ہوئے۔ جب منٹ اہم ہو تو اسے سیٹ کریں؛ رات کے بیک اپ کے لیے ڈیفالٹ رہنے دیں۔

RandomizedDelaySec=10m جان بوجھ کر الٹا کرتا ہے: آغاز کو ایک کھڑکی میں پھیلا دیتا ہے تاکہ دس سرور ایک ہی سیکنڈ میں ایک ہی بیک اپ اسٹوریج پر نہ ٹوٹ پڑیں۔

ایک بار کے کام کے لیے کسی فائل کی ضرورت نہیں:

sudo systemd-run --on-active=30m --unit=cleanup-once /usr/local/bin/cleanup.sh

یہ ایک عارضی ٹائمر بناتا ہے جو ایک بار چلتا ہے اور غائب ہو جاتا ہے؛ تب تک systemctl list-timers اسے دکھاتا ہے۔

3. کون سا استعمال کریں

cronsystemd ٹائمر
سیٹ اپ1 لائن2 فائلیں
لاگزصرف اگر آؤٹ پٹ ری ڈائریکٹ کریںjournalctl -u name.service
سرور بند ہونے کے دوران چھوٹا رنضائعPersistent=true سے بوٹ پر چلتا ہے
اگلی باری پر کام ابھی چل رہا ہودوسری کاپی شروع ہو جاتی ہےپہلی ختم ہونے تک چھوڑ دیا جاتا ہے
درست وقتمنٹ تکAccuracySec=1s سے سیکنڈ تک
اسٹیٹسکوئی نہیںlist-timers اور systemctl status

ایسی تیز لائن کے لیے cron استعمال کریں جو آپ سال بعد بھی پہچان لیں۔ ہر اس چیز کے لیے ٹائمر استعمال کریں جس کی ناکامی آپ کو دیکھنی ہو، جو اوورلیپ نہ ہونی چاہیے یا جو چھوٹ جانے والے ری اسٹارٹ کے بعد بھی چلنی ضروری ہو: بیک اپ، سرٹیفکیٹ کی تجدید، ڈیٹابیس کی صفائی۔ اگر cron کا کام اوورلیپ ہو سکتا ہے تو اسے لپیٹ دیں: flock -n /tmp/backup.lock /usr/local/bin/backup.sh، اور دوسری کاپی فوراً نکل جائے گی۔

دونوں شیڈولر کام چلاتے ہیں اور رک جاتے ہیں۔ جس پروگرام کو چوبیس گھنٹے چلنا اور کریش کے بعد واپس آنا ہو اسے شیڈول نہیں، سروس چاہیے؛ دیکھیں systemd سروس کیسے بنائیں اور Windows کے لیے Windows Server پر اسکرپٹ 24/7 کیسے چلائیں۔ ایک اچھا پہلا ٹائمر ہماری restic بیک اپ گائیڈ والا ہے؛ خودکار سیکیورٹی اپڈیٹس وہ ٹائمر ہیں جو Ubuntu پہلے سے دیتا ہے، apt-daily-upgrade.timer، نئے سرور پر چلنے والے 17 میں سے ایک۔

عمومی سوالات

میرا کام ٹرمینل میں چلتا ہے مگر cron میں نہیں، کیوں؟

تین عام وجوہات۔ cron کام کو bash نہیں بلکہ sh سے چلاتا ہے، اس لیے صرف bash والا نحو ناکام ہو جاتا ہے۔ ہوم فولڈر میں انسٹال ٹولز جیسے nvm، pipx یا cargo، cron کے PATH میں نہیں ہوتے، اس لیے مکمل راستے استعمال کریں۔ اور کمانڈ لائن میں ہر % کمانڈ ختم کر دیتا ہے: ہمارے سرور پر date +%F بدل کر date + بن گیا۔ اسے \% لکھیں یا کمانڈ کو اسکرپٹ میں منتقل کریں۔

cron کا آؤٹ پٹ کہاں جاتا ہے؟

ڈیفالٹ طور پر ای میل پر۔ ہماری امیج میں میل سرور نہیں ہے، اس لیے cron لاگ میں 'No MTA installed, discarding output' لکھتا ہے اور آؤٹ پٹ ضائع ہو جاتا ہے۔ کام میں >> /var/log/myjob.log 2>&1 شامل کریں، یا systemd ٹائمر پر جائیں جس کا آؤٹ پٹ خود بخود journal میں جاتا ہے۔

systemd ٹائمر کا cron پر کیا فائدہ ہے؟

journalctl میں لاگز، پہلے سے چل رہے کام کی دوسری کاپی شروع نہیں ہوتی، سرور بند رہنے کے دوران چھوٹے رنز Persistent=true سے پورے ہوتے ہیں، اور اسٹیٹس لائن اگلا اور آخری رن دکھاتی ہے۔ cron اختصار میں جیتتا ہے: دو فائلوں کے بجائے ایک لائن۔

میرا ٹائمر 18 سیکنڈ دیر سے چلا۔ کیوں؟

ڈیفالٹ طور پر systemd سسٹم کو کم جگانے کے لیے ٹائمرز کو ایک منٹ کی کھڑکی میں اکٹھا کرتا ہے؛ یہی AccuracySec سیٹنگ ہے۔ ہمارا ہر دو منٹ والا ٹائمر 07:42:00 کے بجائے 07:42:18 پر چلا۔ AccuracySec=1s کے ساتھ ٹھیک 07:46:00 پر چلا۔ جب درست منٹ اہم ہو تو اسے سیٹ کریں۔

cron اور ٹائمرز کون سا ٹائم زون استعمال کرتے ہیں؟

سرور کا، جو ہماری امیجز پر UTC ہے۔ timedatectl سے ایک بار سیٹ کریں، ہوسٹ نیم اور ٹائم زون والی ہماری گائیڈ دیکھیں، اور cron اور ٹائمرز اسی کی پیروی کریں گے۔ ٹائمر اپنا زون بھی رکھ سکتا ہے: OnCalendar=*-*-* 03:00 Europe/Kyiv ہمارے ٹیسٹ میں 01:00 UTC پر چلا۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔