سرور اپنی قیمت تب وصول کرتا ہے جب آپ کے سوتے وقت کام کرے: بیک اپ، لاگ روٹیشن، سرٹیفکیٹ کی تجدید، نو بجے رپورٹ۔ 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. کون سا استعمال کریں
| cron | systemd ٹائمر | |
|---|---|---|
| سیٹ اپ | 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 میں سے ایک۔
تبصرے
ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔