Crontab: Linux-এ কাজের সময়সূচির উদাহরণ, সিনট্যাক্স ও সাধারণ ভুল
Crontab হলো সময়সূচির তালিকা, যা অনুযায়ী cron ডেমন কমান্ড চালায়: প্রতিটি লাইনে পাঁচটি সময়ের ঘর (মিনিট, ঘণ্টা, মাসের দিন, মাস, সপ্তাহের দিন) এবং একটি কমান্ড, যেমন */5 * * * * /opt/backup.sh প্রতি ৫ মিনিটে স্ক্রিপ্ট চালায়। তালিকা সম্পাদনা হয় crontab -e দিয়ে, আর বেশিরভাগ সমস্যার কারণ cron-এর সীমিত পরিবেশ: পুরো পথ লিখুন এবং আউটপুট লগ ফাইলে পাঠান।
Cron হলো Linux-এর স্ট্যান্ডার্ড কাজের সময়সূচি: cron ডেমন প্রতি মিনিটে সময়সূচির তালিকা (crontab) পড়ে এবং যে কমান্ডের সময় এসেছে তা চালায়। এভাবেই রাতে ব্যাকআপ নেওয়া হয়, অস্থায়ী ফাইল পরিষ্কার হয়, সার্টিফিকেট নবায়ন হয় এবং রিপোর্ট পাঠানো হয়। নিচে আছে সিনট্যাক্স, সাধারণ ক্ষেত্রের crontab উদাহরণ, এবং যেসব কারণে কাজ «নীরবে» চলে না তার বিশ্লেষণ।
crontab খোলা ও সম্পাদনা
প্রতিটি ব্যবহারকারীর নিজস্ব তালিকা আছে। তার সঙ্গে কাজ করা হয় crontab কমান্ড দিয়ে, /var/spool/cron-এর ফাইল সরাসরি সম্পাদনা করে নয়:
| কমান্ড | কী করে |
|---|---|
crontab -e | নিজের তালিকা সম্পাদকে খোলে (প্রথমবার সম্পাদক বেছে নিতে বলে) |
crontab -l | বর্তমান তালিকা দেখায় |
crontab -r | পুরো তালিকা মুছে দেয়, নিশ্চিতকরণ ছাড়া |
crontab -i -r | নিশ্চিতকরণসহ মোছে (Debian/Ubuntu, RHEL) |
sudo crontab -u alice -e | অন্য ব্যবহারকারীর তালিকা সম্পাদনা |
crontab ফাইল | তালিকা ফাইলের বিষয়বস্তু দিয়ে বদলানো |
crontab -e সংরক্ষণের পর সিনট্যাক্স যাচাই করে এবং লেখে crontab: installing new crontab। লাইনে ভুল থাকলে দেখাবে errors in crontab file, can't install এবং আবার সম্পাদনার প্রস্তাব। ডেমন রিস্টার্ট করতে হয় না — পরিবর্তন নিজে থেকেই গৃহীত হয়।
-r নিয়ে সাবধান: e ও r কীবোর্ডে পাশাপাশি, আর তালিকার কোনো ব্যাকআপ থাকে না। একটি ভালো অভ্যাস হলো ব্যাকআপ রাখা:
crontab -l > ~/crontab.bak
# পুনরুদ্ধার
crontab ~/crontab.bak
crontab-এর সিনট্যাক্স: পাঁচটি সময়ের ঘর
প্রতিটি কাজের লাইন দেখতে এরকম:
# ┌───────── মিনিট (0–59)
# │ ┌─────── ঘণ্টা (0–23)
# │ │ ┌───── মাসের দিন (1–31)
# │ │ │ ┌─── মাস (1–12 বা jan–dec)
# │ │ │ │ ┌─ সপ্তাহের দিন (0–7 বা sun–sat; 0 ও 7 — রবিবার)
# │ │ │ │ │
* * * * * কমান্ড
প্রতিটি ঘরে বিশেষ চিহ্ন ব্যবহার করা যায়:
| চিহ্ন | মান | উদাহরণ |
|---|---|---|
* | যেকোনো মান | * * * * * — প্রতি মিনিটে |
, | তালিকা | 0 9,18 * * * — সকাল ৯টা ও সন্ধ্যা ৬টায় |
- | পরিসর | 0 9-18 * * * — ৯টা থেকে ১৮টা, প্রতি ঘণ্টায় |
/ | ধাপ | */15 * * * * — প্রতি ১৫ মিনিটে |
ধাপ ও পরিসর একসঙ্গে লেখা যায়: 0 8-20/2 * * * — ৮টা থেকে ২০টা পর্যন্ত প্রতি দুই ঘণ্টায় (৮, ১০, …, ২০)। সময় নেওয়া হয় সিস্টেমের টাইমজোন অনুযায়ী — timedatectl দিয়ে যাচাই করুন।
প্রতিদিনের crontab উদাহরণ
| সময়সূচি | crontab-এর লাইন |
|---|---|
| প্রতি মিনিটে | * * * * * |
| প্রতি ৫ মিনিটে | */5 * * * * |
| প্রতি ৩০ মিনিটে | */30 * * * * বা 0,30 * * * * |
| প্রতি ঘণ্টার শুরুতে | 0 * * * * |
| প্রতি ৬ ঘণ্টায় | 0 */6 * * * |
| প্রতিদিন রাত ৩টায় | 0 3 * * * |
| প্রতিদিন রাত ১১:৪৫-এ | 45 23 * * * |
| কর্মদিবসে সকাল ৯টায় | 0 9 * * 1-5 |
| সপ্তাহান্তে দুপুর ১২টায় | 0 12 * * 6,0 |
| প্রতি সোমবার সকাল ৮:৩০-এ | 30 8 * * 1 |
| প্রতি মাসের ১ তারিখ, ০০:০০-এ | 0 0 1 * * |
| প্রতি ত্রৈমাসিকে | 0 0 1 1,4,7,10 * |
| বছরে একবার, ১ জানুয়ারি | 0 0 1 1 * |
| কর্মঘণ্টায় প্রতি ১০ মিনিটে | */10 9-18 * * 1-5 |
সম্পূর্ণ কাজের লাইন — সময়সূচি ও কমান্ড একসঙ্গে:
# প্রতি রাতে ৩টায় ডেটাবেস ব্যাকআপ
0 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1
# রবিবার সকালে ৭ দিনের বেশি পুরোনো অস্থায়ী ফাইল মোছা
0 4 * * 0 /usr/bin/find /tmp/app -type f -mtime +7 -delete
# প্রতি ৫ মিনিটে সাইটের স্বাস্থ্য পরীক্ষা
*/5 * * * * /usr/bin/curl -fsS https://example.com/health > /dev/null || /usr/local/bin/alert.sh
@reboot, @daily ও অন্যান্য বিশেষ লাইন
পাঁচ ঘরের বদলে ছোট উপনাম লেখা যায়:
| উপনাম | সমতুল্য |
|---|---|
@reboot | cron ডেমন শুরু হওয়ার সময় একবার (সিস্টেম বুটের পর) |
@hourly | 0 * * * * |
@daily / @midnight | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly / @annually | 0 0 1 1 * |
@reboot /home/alice/bin/start-tunnel.sh >> /home/alice/tunnel.log 2>&1
যেসব সার্ভিস সব সময় চলবে এবং পড়ে গেলে আবার চালু হবে, তাদের জন্য @reboot দুর্বল সমাধান: ভালো হয় Restart=on-failure-সহ systemd ইউনিট বানানো।
প্রতি N সেকেন্ডে কাজ চালানো
cron-এর ন্যূনতম একক এক মিনিট। আরও ঘন ঘন দরকার হলে দুটি কৌশল আছে। প্রথমটি — sleep দিয়ে সময় সরিয়ে কয়েকটি লাইন:
* * * * * /opt/check.sh
* * * * * sleep 30; /opt/check.sh
দ্বিতীয়টি, আরও সঠিক — systemd টাইমার OnUnitActiveSec=30s-সহ। কাজ যদি মিনিটে একবারের বেশি চালাতে হয়, সাধারণত সেটি ডেমন বা টাইমারের কাজ, cron-এর নয়।
সিস্টেম crontab: /etc/crontab ও /etc/cron.d
ব্যবহারকারীর তালিকা ছাড়াও সিস্টেম তালিকা আছে। তাদের ফরম্যাট আলাদা: সময় ও কমান্ডের মাঝে থাকে ব্যবহারকারীর নাম, যার অধিকারে কমান্ড চলবে।
# /etc/cron.d/certbot-renew
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root certbot renew --quiet
কোথায় কী থাকে:
/etc/crontab— প্রধান সিস্টেম তালিকা; Debian/Ubuntu-তে এখান থেকে নিচের ডিরেক্টরিগুলো চালু হয়।/etc/cron.d/— আলাদা ফাইলে কাজ, প্যাকেজ বা Ansible দিয়ে যোগ করা সুবিধাজনক।/etc/cron.hourly/,cron.daily/,cron.weekly/,cron.monthly/— এখানে সময়সূচি ছাড়া চালানোযোগ্য স্ক্রিপ্ট রাখা হয়; এগুলো চালায়run-parts(বা anacron)।
run-parts-এর একটি ফাঁদ: Debian ও Ubuntu-তে যে ফাইলের নামে বিন্দু (.) আছে তা বাদ দেওয়া হয়। /etc/cron.daily/-এর backup.sh চলবে না — নাম দিন backup। কী চলবে তা দেখতে: run-parts --test /etc/cron.daily।
/etc/cron.d/-এর ফাইল root-এর মালিকানায় হতে হবে, গ্রুপ ও অন্যদের লেখার অধিকার থাকবে না, এবং শেষে নতুন লাইন থাকতে হবে — নইলে cron সেগুলো উপেক্ষা করবে।
cron-এর পরিবেশ: PATH, SHELL ও ভেরিয়েবল
«টার্মিনালে কাজ করে, cron-এ করে না» — এর মূল কারণ পরিবেশ। Cron কমান্ড চালায় /bin/sh দিয়ে, আপনার .bashrc ও .profile ছাড়া, সীমিত PATH-সহ (সাধারণত /usr/bin:/bin)। তাই /usr/local/bin-এর docker, node বা php খুঁজে নাও পেতে পারে।
ভেরিয়েবল তালিকার শুরুতে লেখা যায়:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
CRON_TZ=Europe/Moscow
0 6 * * * cd /srv/app && ./report.sh
MAILTO— কাজের আউটপুট কোথায় যাবে;MAILTO=""ইমেইল পাঠানো বন্ধ করে।CRON_TZ— সময়সূচির টাইমজোন (RHEL/Fedora-র cronie সমর্থন করে; Debian-এর cron-এ এই ভেরিয়েবল কাজ করে না)।- ভেরিয়েবলের মানে
$HOME/bin-এর মতো প্রতিস্থাপন নেই — পুরো পথ লিখুন।
সবচেয়ে নির্ভরযোগ্য উপায় — কাজে সব প্রোগ্রাম ও ফাইলের পুরো পথ লেখা, আর স্ক্রিপ্টের প্রথম লাইনে shebang: #!/bin/bash।
cron-এর লগ কোথায় দেখবেন
Cron জার্নালে লেখে কাজটি চালু হয়েছে কিনা, কিন্তু কাজের আউটপুট লেখে না:
# Debian/Ubuntu
grep CRON /var/log/syslog
# systemd-journald দিয়ে
journalctl -u cron --since today # Debian/Ubuntu
journalctl -u crond --since today # RHEL, Fedora, Rocky
# journald ছাড়া RHEL
tail -f /var/log/cron
চালু হওয়ার লাইন দেখতে মোটামুটি এরকম:
Oct 14 03:00:01 web1 CRON[21544]: (root) CMD (/usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1)
কাজ কী লিখল এবং কোন ত্রুটিতে পড়ল দেখতে স্ট্যান্ডার্ড আউটপুট ও ত্রুটি দুটোই ফাইলে পাঠান: >> /var/log/job.log 2>&1। এটি না করলে আউটপুট স্থানীয় মেইলে যায়, আর মেইল এজেন্ট ইনস্টল না থাকলে হারিয়ে যায় (জার্নালে আসে No MTA installed, discarding output)।
কেন cron কাজ চালায় না: সাধারণ ভুল
কমান্ড পাওয়া যাচ্ছে না
লক্ষণ: কাজের লগে command not found। কারণ সীমিত PATH। সমাধান: প্রোগ্রামের পুরো পথ (which docker দেখাবে) অথবা তালিকার শুরুতে PATH= লাইন।
কমান্ডে শতাংশ চিহ্ন
crontab-এ % চিহ্ন মানে নতুন লাইন: প্রথম %-এর পরের সব অংশ কমান্ডের স্ট্যান্ডার্ড ইনপুটে যায়। তাই তারিখসহ ফাইলের নামের ক্লাসিক লাইন ভেঙে যায়:
# ভুল — প্রথম % এ কমান্ড কাটা পড়বে
0 2 * * * tar czf /backup/site-$(date +%F).tar.gz /var/www
# সঠিক — escape করুন
0 2 * * * tar czf /backup/site-$(date +\%F).tar.gz /var/www
আরও সহজ: যুক্তি একটি স্ক্রিপ্টে সরিয়ে নিন, যেখানে % escape করতে হয় না।
স্ক্রিপ্ট চালানোযোগ্য নয় বা লাইন-শেষ ভুল
Permission denied মানে ফাইলে x বিট নেই: chmod +x script.sh দিন, অথবা স্পষ্টভাবে চালান /bin/bash /opt/script.sh। স্ক্রিপ্ট Windows-এ লেখা হলে CRLF লাইন-শেষ থেকে অদ্ভুত ত্রুটি আসে /bin/bash^M: bad interpreter — ঠিক করে sed -i 's/\r$//' script.sh বা dos2unix।
আপেক্ষিক পথ ও কাজের ডিরেক্টরি
কাজ শুরু হয় ব্যবহারকারীর হোম ডিরেক্টরিতে। স্ক্রিপ্ট যদি ./config.ini পড়ে, তবে সেটি খুঁজবে ~-এ। কমান্ডের আগে cd /srv/app && লিখুন, অথবা স্ক্রিপ্টের ভেতরে পুরো পথ ব্যবহার করুন।
মাসের দিন ও সপ্তাহের দিন একসঙ্গে
দুটো ঘরই দেওয়া থাকলে cron চালায় যখন যেকোনো একটি মেলে, দুটোই একসঙ্গে নয়। লাইন 0 9 13 * 5 চলবে ১৩ তারিখে এবং প্রতি শুক্রবার, শুধু ১৩ তারিখের শুক্রবারে নয়। প্রয়োজনীয় শর্ত কমান্ডের ভেতরে যাচাই করুন:
0 9 13 * * [ "$(date +\%u)" = 5 ] && /opt/friday13.sh
কাজ একটির ওপর আরেকটি চালু হওয়া
ব্যাকআপ যদি ব্যবধানের চেয়ে বেশি সময় নেয়, পরের চালু শুরু হয় আগেরটির ওপর। সুরক্ষা — flock-এর মাধ্যমে লক:
*/10 * * * * /usr/bin/flock -n /tmp/sync.lock /opt/sync.sh
-n ফ্ল্যাগে দ্বিতীয় কপি সঙ্গে সঙ্গে শেষ হয়ে যায়, যদি প্রথমটি এখনো চলে।
cron ডেমন চালু নেই
systemctl status cron দিয়ে দেখুন (RHEL-এ crond)। ন্যূনতম ইমেজে, যেমন Docker কন্টেইনারে, cron ডেমনই থাকে না — তাই crontab-এর কাজ চালানোর কেউ নেই।
cron-এর কাজ ডিবাগ করা
cron-এর কাছাকাছি পরিবেশে কমান্ড চালান:
env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=$HOME /bin/sh -c '/opt/backup.sh'
এখানে ত্রুটি হলে cron-এও তা হবে। সাময়িকভাবে সময়সূচি দিন * * * * *, আউটপুট ফাইলে পাঠান এবং tail -f দিয়ে দেখুন। সময়সূচির অভিব্যক্তি যাচাইয়ের জন্য অনলাইন ক্যালকুলেটর সাহায্য করে, কিন্তু চূড়ান্ত কথা বলে সিস্টেমের লগ।
cron ব্যবহারের অনুমতি: cron.allow ও cron.deny
অ্যাক্সেস নিয়ন্ত্রণ করে /etc/cron.allow ও /etc/cron.deny ফাইল। cron.allow থাকলে crontab শুধু তাতে তালিকাভুক্ত ব্যবহারকারীরা পান। না থাকলে কিন্তু cron.deny থাকলে — সবাই পায়, শুধু তালিকাভুক্তরা বাদ। নিষিদ্ধ ব্যবহারকারী crontab -e দিলে পাবেন You (bob) are not allowed to use this program।
সারসংক্ষেপ
Crontab হলো পাঁচটি সময়ের ঘর ও একটি কমান্ডের লাইন: */5 * * * * — প্রতি ৫ মিনিটে, 0 3 * * * — প্রতি রাতে, 0 9 * * 1-5 — কর্মদিবসে। তালিকা সম্পাদনা করুন crontab -e দিয়ে, পুরো পথ লিখুন, %-কে escape করুন, আউটপুট লগে পাঠান এবং দীর্ঘ কাজ flock দিয়ে রক্ষা করুন। এই উদাহরণগুলো বেশিরভাগ সার্ভার কাজের জন্য যথেষ্ট, আর স্বয়ংক্রিয়করণ ও সময়সূচি Linux কোর্সে বিস্তারিতভাবে হাতে-কলমে শেখানো হয়।
সাধারণ প্রশ্ন
cron ও anacron-এর পার্থক্য কী?
cron কাজ চালায় ঠিক নির্দিষ্ট সময়ে, এবং কম্পিউটার বন্ধ থাকলে সেই কাজ বাদ যায়। anacron নিশ্চিত করে যে দৈনিক, সাপ্তাহিক ও মাসিক কাজ কম্পিউটার চালু হওয়ার পর অবশ্যই চলবে, তাই ল্যাপটপ ও ডেস্কটপের জন্য উপযুক্ত।
cron ও systemd টাইমারের মধ্যে কোনটি ভালো?
cron সহজ এবং প্রায় সব জায়গায় আছে। systemd টাইমার দেয় journalctl-এ লগ, নির্ভরতা, সম্পদ সীমা এবং বাদ পড়া চালুর জন্য Persistent=true, তাই আধুনিক সার্ভারে গুরুত্বপূর্ণ কাজের জন্য এটি বেশি বেছে নেওয়া হয়।
ব্যবহারকারীর crontab ফাইল কোথায় থাকে?
Debian ও Ubuntu-তে /var/spool/cron/crontabs/নাম, আর RHEL ও Fedora-তে /var/spool/cron/নাম। এই ফাইল সরাসরি সম্পাদনা না করাই ভালো, crontab -e ব্যবহার করুন।
crontab-এর একটি কাজ সাময়িকভাবে বন্ধ করব কীভাবে?
crontab -e দিয়ে লাইনের শুরুতে # লিখে মন্তব্য করুন। ব্যবহারকারীর সব কাজ বন্ধ করতে তালিকা crontab -l দিয়ে ফাইলে সংরক্ষণ করুন এবং তারপর crontab -r দিয়ে মুছুন।
মাসের শেষ দিনে কাজ চালাব কীভাবে?
এর জন্য আলাদা ঘর নেই। কাজটি ২৮–৩১ তারিখে চালান এবং ভেতরে যাচাই করুন যে আগামীকাল ১ তারিখ: 0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/job.sh।
“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।
কোর্সে যান