Skip to content
VDS · অ্যাপ ও বট

নির্ধারিত টাস্ক: cron ও systemd টাইমার

নির্ধারিত টাস্ক কীভাবে চালাবেন, কেন টাস্ক ম্যানুয়ালি কাজ করে কিন্তু cron-এ চুপ থাকে এবং কখন systemd টাইমারে যাবেন।

আপডেট: ২৩ আগস্ট, ২০২৬

ব্যাকআপ, সার্টিফিকেট রিনিউয়াল, টেম্প ফাইল ক্লিনআপ, নাইটলি রিপোর্ট — এগুলো সবই শিডিউলড টাস্ক। Linux-এ আপনি এগুলো দুইভাবে সমাধান করতে পারেন: ক্লাসিক cron এবং systemd টাইমার।

Cron: দ্রুত শুরু

আপনি একটি ইউজারের শিডিউল এভাবে এডিট করেন:

crontab -e
crontab -l

লাইনের ফরম্যাট হলো পাঁচটি ফিল্ড এবং একটি কমান্ড:

# min  hour  day  month  day-of-week  command
  0    4    *     *      *            /usr/local/bin/backup.sh
  */15 *    *     *      *            /usr/local/bin/check.sh
  30   3    *     *      0            /usr/bin/systemctl restart myapp

দরকারি শর্টকাট: @daily, @hourly, @reboot। জবগুলো আদৌ চলেছে কিনা তা দেখতে:

grep CRON /var/log/syslog | tail -30
journalctl -u cron --since "1 hour ago"

কেন একটি স্ক্রিপ্ট হাতে চলে কিন্তু cron-এ চলে না

এটি সবচেয়ে সাধারণ সমস্যা, এবং কারণ প্রায় সবসময়ই তিনটির একটি।

ভিন্ন এনভায়রনমেন্ট। Cron-এ একটি ন্যূনতম PATH থাকে এবং .bashrc থেকে আপনার কোনো ভেরিয়েবল থাকে না। প্রোগ্রামগুলোর সম্পূর্ণ পাথ ব্যবহার করুন এবং স্ক্রিপ্টের শুরুতে বা crontab-এ ভেরিয়েবল স্পষ্টভাবে সেট করুন:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ভিন্ন ডিরেক্টরি। জবটি ইউজারের হোম ডিরেক্টরিতে শুরু হয়, তাই রিলেটিভ পাথ অন্য জায়গায় পয়েন্ট করে। সবসময় অ্যাবসোলিউট পাথ ব্যবহার করুন।

আউটপুট কোথাও যায় না। একটি এরর হয়েছিল, কিন্তু কেউ দেখেনি। একটি লগ লিখুন:

0 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

আরও দুটি ছোট বিষয়: একটি cron লাইনে % ক্যারেক্টারটি \% হিসেবে এস্কেপ করতে হবে, এবং একটি crontab ফাইল অবশ্যই একটি নিউলাইন দিয়ে শেষ হতে হবে — নাহলে শেষ জবটি উপেক্ষিত হয়।

বাইরে থেকে যাচাই করা দরকার যে একটি জব চলেছে। একটি নীরব cron দেখতে ঠিক একটি সফল cron-এর মতোই। Uptime Kuma-তে একটি পুশ চেক সেট আপ করুন: স্ক্রিপ্টটি শেষে একটি অ্যাড্রেসে পিং করে, এবং যদি এটি একদিন ধরে পিং না করে, আপনি একটি অ্যালার্ট পাবেন।

systemd টাইমার

যখন একটি টাস্ক একটি একক কমান্ডের চেয়ে জটিল হয়, তখন একটি টাইমার বেশি সুবিধাজনক: এতে একটি জার্নাল, ডিপেন্ডেন্সি, রিসোর্স লিমিট এবং একসাথে দুটি কপি চলা থেকে সুরক্ষা থাকে।

# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run nightly backup

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
RandomizedDelaySec=15m

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
journalctl -u backup.service -n 50

Persistent=true মেশিন বন্ধ থাকলে একটি মিস হওয়া রান ক্যাচ আপ করে — cron এটি করতে পারে না। RandomizedDelaySec লোড ছড়িয়ে দেয় যাতে এক ডজন টাস্ক একই সেকেন্ডে শুরু না হয়।

যা মনে রাখবেন

  • মেশিনের সময় ডিফল্টভাবে UTC। “ভোর ৪টা” সেট করার আগে timedatectl চেক করুন।
  • ভারী টাস্ক (আর্কাইভ, ব্যাকআপ ভেরিফিকেশন) ডিস্ক-বাউন্ড। ডিস্ক স্পিড দেখুন এবং সেগুলো রাতের জন্য শিডিউল করুন।
  • প্রতি পাঁচ মিনিটে চলা একটি দীর্ঘ টাস্ক নিজের সাথে ওভারল্যাপ করবে। systemd-এ Type=oneshot সাহায্য করে; cron-এ flock-এর মাধ্যমে একটি লক ব্যবহার করুন:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh