ক্রন (cron) হচ্ছে ইউনিক্স-সদৃশ অপারেটিং সিস্টেমের টাস্ক শিডিউলার প্রোগ্রাম। এর কাজ হচ্ছে নির্দিষ্ট সময় পরপর নির্দিষ্ট কাজ করা, ভালো করে বললে নির্দিষ্ট কোনো প্রোগ্রাম বা কমান্ড বা স্ক্রিপ্ট এক্সিকিউট করা। মনে করুন, আপনার একটি ব্যাশ বা পাইথন স্ক্রিপ্ট আছে, যেটি প্রতিদিন সকালে কম্পিউটার চালু করেই এক্সিকিউট করতে হয়। আপনি হয়তো প্রতি সপ্তাহে একবার দরকারি ফাইলগুলোর ব্যাকআপ নিয়ে থাকেন, বা লগ ফাইলগুলো পরিষ্কার করেন। এই কাজগুলো একটি স্ক্রিপ্ট লিখে ক্রনের সাহায্যে অটোমেটিক করে ফেলতে পারেন।

ক্রন হচ্ছে একটি ডিমন (daemon)। ডিমন হচ্ছে এক ধরনের প্রোগ্রাম যা সবসময় ব্যাকগ্রাউন্ডে চলতে থাকে, যার ওপর সাধারণ ইউজারের সরাসরি নিয়ন্ত্রণ থাকে না। ক্রন প্রতি মিনিটে ক্রনট্যাব (crontab; cron table-এর সংক্ষিপ্ত নাম) নামক একটি ফাইল পরীক্ষা করে, এবং ওই মিনিটে কোনো জব থাকলে তা এক্সিকিউট করে। ক্রনট্যাবে যেসব প্রোগ্রাম বা কমান্ড লেখা থাকে, সেগুলোকে বলে ক্রন জব।

ক্রনট্যাব হচ্ছে একটি টেক্সট ফাইল। ক্রনট্যাব এডিট করার জন্য নিচের কমান্ডটি চালাতে হয় –

$ crontab -e

প্রথমবার এটি চালালে একটি এডিটর সিলেক্ট করতে বলতে পারে। আমি এক্ষেত্রে ভিম ব্যবহার করি, আপনারা চাইলে nano ব্যবহার করতে পারেন। ফাইলটি ওপেন হলে কিছু কমেন্টেড লেখা দেখা যাবে। একেবারে শেষে নিচের মতো একটি লাইন পাওয়া যাবে –

# m h  dom mon dow   command

এটি ক্রন জব লেখার ফরম্যাট। এখানে প্রথম পাঁচটি কলাম ক্রন জব চলার সময় নির্ধারণ করে। কলামগুলো হলো :

  • m – মিনিট (0–59)
  • h – ঘণ্টা (0–23; ২৪ ঘণ্টা ফরম্যাটে)
  • dom – তারিখ (1–31)
  • mon – মাস (1–12)
  • dow – বার (0–6; 0 হচ্ছে রবিবার)
  • command – যে কমান্ড বা প্রোগ্রামটি এক্সিকিউট হবে তার পাথ।

এখানে এই m h dom mon dow command ক্রম খুব গুরুত্বপূর্ণ। তাই ওপরের লাইনটি ক্রনট্যাব ফাইলে না থাকলে নিজে যোগ করে নিতে হবে। এতে ভবিষ্যতে কোনো ক্রন জব যোগ করতে সুবিধা হবে, কলামগুলোর ক্রম মুখস্ত করে রাখতে হবে না।

এবার তাহলে পরীক্ষার জন্য আমরা একটি ক্রন জব সেট করে দেখতে পারি। আমাদের এই ক্রন জবটি ‘hello’ লেখাটিকে একটি ফাইলে সেভ করবে। সে জন্য টার্মিনালে crontab -e কমান্ড দিয়ে ক্রনট্যাব খুলুন (যদি না খোলা থাকে)। এরপর ফাইলের একেবারে শেষে গিয়ে নিচের লাইনটি যোগ করুন (প্রয়োজনে স্ক্রিনশট দেখুন) –

34   *    *    *    *    echo "hello cron" > ~/hello

এখানে 34-এর জায়গায় আপনার কম্পিউটারের সময় দেখে বর্তমান মিনিটের চেয়ে পাঁচ মিনিট পরের সময় দিন। এখন ফাইলটি সেভ করুন। পাঁচ মিনিট পর আপনার হোম ডিরেক্টরিতে hello নামের একটি ফাইল তৈরি হবে, যেখানে লেখা থাকবে hello cron।

ওপরে চারটি কলামে * চিহ্নের মানে হচ্ছে কলামগুলো সব সময় এক্সিকিউট হবে। ক্রন জবটি প্রতি ঘণ্টার 34তম মিনিটে এক্সিকিউট হবে। আমরা যদি চাই যে এপ্রিল মাসের 22 তারিখ রাত 11টা 20 মিনিটে একটি ক্রন জব চালাব, তাহলে ক্রনট্যাবে নিচের লাইনটি যোগ করতে হবে –

20    23    22    4    *    /path/to/job

এখানে সপ্তাহের দিন * দিয়েছি, এতে 22 তারিখ যে বারই হোক না কেন, জবটি চলবে। এবং এই জবটি ক্রনট্যাবে কয়েক বছর রেখে দিলে প্রতি বছর 22শে এপ্রিল 11টা 20 মিনিটে এক্সিকিউট হবে। উল্লেখ্য যে, 22শে এপ্রিল একেক বছর একেক বার হবে।

আবার আপনি হয়তো কোনো জব প্রতি 5 মিনিট পর পর চালাতে চাচ্ছেন। তাহলে ক্রনট্যাবে নিচের মতো করে জবটি যোগ করে নিন –

*/5   *    *    *    *    /path/to/job

এই ক্রন জবটি প্রতি 5 মিনিট পর পর চলতে থাকবে। আবার আপনি হয়তো কোনো জব প্রতি ঘণ্টায় 5, 17 ও 49 মিনিটে একবার করে চালাতে চাচ্ছেন। সেক্ষেত্রে নিচের মতো করে কমা দিয়ে মিনিট উল্লেখ করে দিন –

5,17,49  *    *    *    *    /path/to/job

একইভাবে দিন, মাস ইত্যাদিও ঠিক করে দেওয়া যায়। হাইফেন দিয়ে রেঞ্জ উল্লেখ করে দেওয়া যায় –

5    6-11   *    *    *    /path/to/job

এই ক্রন জবটি সকাল ৬টা থেকে ১১টা পর্যন্ত প্রতি ঘণ্টায় চলবে (৬টা ৫, ৭টা ৫, …, ১১টা ৫ মিনিটে)।

কোনো জব যদি প্রতি ঘণ্টা/সপ্তাহ/মাস/বছরে একবার করে চালানোর প্রয়োজন হয়, তাহলে ওপরের মতো * দিয়ে সব সিলেক্ট না করে কিছু বিশেষ স্ট্রিং-ও ব্যবহার করতে পারেন। যেমন, কোনো জব যদি প্রতিবার কম্পিউটার চালু হওয়ার পর এক্সিকিউট করার প্রয়োজন হয়, তাহলে @reboot স্ট্রিং ব্যবহার করতে পারেন।

@reboot    /path/to/job

এভাবে @hourly, @daily, @weekly, @monthly, @yearly ব্যবহার করে যেকোনো ক্রন জব সেট করা যায়।

রুট হিসেবে কোনো ক্রন জব সেট করতে চাইলে রুট ইউজার হিসেবে লগ ইন করে নিতে হবে। অথবা sudo crontab -e ব্যবহার করতে হবে। অন্য কোনো ইউজারের ক্রনট্যাব এডিট করতে চাইলে –

$ crontab -u <username> -e

তো ক্রন জবের মৌলিক বিষয়গুলো আমরা মোটামুটি শিখে ফেললাম। এবার একটি প্রজেক্ট করা যাক 😉

প্রতিদিন আমরা অনেক প্রকার ফাইল ইন্টারনেট থেকে ডাউনলোড করি। সেগুলো সাধারণত Downloads ডিরেক্টরিতে গিয়ে জমা হয়। এখন আমরা একটি সহজ ব্যাশ স্ক্রিপ্ট লিখব, স্ক্রিপ্টটি Downloads থেকে মিউজিক, ভিডিও, ছবি, ডকুমেন্ট যথাক্রমে Music, Videos, Pictures ও Documents ডিরেক্টরিতে, এবং বাকি ফাইলগুলো Others ডিরেক্টরিতে নিয়ে রাখবে। এতে আমাদের ফাইলগুলো গোছানো থাকবে, প্রয়োজনের সময় খুঁজে পেতে সুবিধা হবে। স্ক্রিপ্টটি আমরা ক্রনট্যাবে যোগ করে দেব, যাতে প্রতিবার কম্পিউটার অন করার পর Downloads ফোল্ডারটি পরিষ্কার হয়ে যায়।

#!/usr/bin/env bash

# redirect standard error to a black hole ;)
exec 2> /dev/null

# create Others directory, if not present
if [[ ! -d ~/Others/ ]]
then
    mkdir ~/Others/
fi

# move files to their destination
cd ~/Downloads/
mv *.jpg *.jpeg *.png *.gif *.svg  ~/Pictures/
mv *.mp4 *.mkv *.webm              ~/Videos/
mv *.mp3 *.wav *.aac *.m4a         ~/Music/
mv *.docx *.doc *.odt *.uot *.pdf  ~/Documents/

# move the rest to ~/Others
mv *                               ~/Others/

ওপরের স্ক্রিপ্টটি লিখে (বা কপি করে) ~/.my_scripts/ ডিরেক্টরিতে নিয়ে রাখুন। ফাইলের এক্সটেনশন হবে .sh। ধরি ফাইলটির নাম cleaner.sh। এখন ফাইলটিকে এক্সিকিউশন পারমিশন দিতে হবে –

$ chmod u+x ~/.my_scripts/cleaner.sh

এবার ক্রনট্যাব ওপেন করে (crontab -e) নিচের লাইনটি যোগ করুন (আগে যোগ করা ক্রন জবগুলো মুছে ফেলতে পারেন)।

@reboot    ~/.my_scripts/cleaner.sh

ফাইলটি সেভ করে নিন। এবার সারাদিনে যা কিছুই ডাউনলোড করুন না কেন, পরেরবার কম্পিউটার অন করার পরে Downloads ফোল্ডারটি পরিষ্কার হয়ে যাবে। এতে নতুন ডাউনলোড করা ফাইলগুলো সহজে খুঁজে পাবেন। যদি প্রতিবার রিবুটে ফাইলগুলো সরাতে না চান, তাহলে @reboot-এর পরিবর্তে @weekly সেট করতে পারেন। এতে প্রতি রবিবার ফাইলগুলো যার যার নির্ধারিত ফোল্ডারে চলে যাবে।

এবার আপনার কাজ হচ্ছে রবিবারের পরিবর্তে জবটি প্রতি শুক্রবারে সেট করা। যদি করতে পারেন, তাহলে ক্রন জবের ব্যবহার আপনার কাছে পরিষ্কার, না পারলে আর্টিকেলটি কিছুক্ষণ পর আবার পড়তে পারেন।

ক্রন নিয়ে আরো জানতে চাইলে উবুন্টুর কমিউনিটি হেল্প উইকি দেখতে পারেন – https://help.ubuntu.com/community/CronHowto

(সুবিন ডট কমে পূর্বে প্রকাশিত।)