launchd হলো স্ক্রিপ্ট এবং প্রসেস শুরু, বন্ধ ও ম্যানেজ করার একটি টুল। আপনি যদি Linux-এর যেকোনো ভার্সনের সাথে কাজ করেছেন, আপনি cron-এর সাথে পরিচিত হতে পারেন। launchd হলো মূলত macOS-এ cron।
ডেমন (Daemons) কী?
ডেমন (উচ্চারণ "ডিমনস") হচ্ছে ব্যাকগ্রাউন্ডে চলা স্ক্রিপ্ট। অ্যাপ্লিকেশনের বিপরীতে, ডেমন প্রসেস হিসেবে চলে এবং ইউজার বা অন্য অ্যাপ্লিকেশনের ডিরেক্ট কন্ট্রোলে নয়। macOS-এ সেগুলো launchd ফ্রেমওয়ার্কের অধীনে থাকে যা ডিসাইড করে কখন সেগুলো শুরু এবং বন্ধ হবে।
অস্বাভাবিক নামটি আসছে Maxwell's demon-থেকে, একটি কাল্পনিক এজেন্ট যা থার্মোডাইনামিক্স চিন্তা পরীক্ষা-এ মলিকিউল সোর্ট করে।
স্ক্রিপ্ট লেখা
launchd-এর মাধ্যমে ডেমন চালানোর জন্য, আপনাকে কিছু স্ক্রিপ্ট লিখতে হবে। সবচেয়ে সাধারণ স্ক্রিপ্টিং ল্যাঙ্গুয়েজ হলো bash। আপনি যদি bash স্ক্রিপ্টিং-র সম্পর্কে আরও জানতে চান, আপনি আমাদের bash স্ক্রিপ্টিং বিগিনার গাইড চেক আউট করতে পারেন।
launchd ব্যবহার করা
launchd-এ স্ক্রিপ্টগুলো জব ডেফিনিশন দ্বারা ট্রিগার হয় যা .plist ফাইল নির্দিষ্ট ডিরেক্টরিতে স্টোরড থাকে। এই XML ফাইলগুলো জবকে একটি নাম দেয়, কী স্ক্রিপ্ট লঞ্চ করা উচিত সেটি স্পেসিফাই করে, এবং কখন স্ক্রিপ্ট রান করা উচিত সেটি ইন্ডিকেট করে। একবার আপনি আপনার স্ক্রিপ্ট লিখলে, আপনি একটি জব ডেফিনিশন লিখবেন এবং লোড করবেন যা উপযুক্ত সময়ে স্ক্রিপ্ট লঞ্চ করবে।
একটি জব ডেফিনিশন নিচের মত দেখতে পারে:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>local.restart</string> <key>Program</key> <string>/Users/user/Scripts/restart.sh</string> <key>RunAtLoad</key> <true/> </dict> </plist>
প্রয়োজন অনুযায়ী মডিফাই করুন, তারপর .plist এক্সটেনশন দিয়ে একটি টেক্সট ফাইলে রাখুন সঠিক ডিরেক্টরিতে ড্রপ করার আগে (নিচে দেখুন)।
জব ডেসক্রিপশনে কিছু কী পার্ট রয়েছে:
- Label: launchd-এ জবের নাম। প্রতিটি জবের জন্য উনিক হতে হবে। এগুলো রিভার্স ডোমেইন নোটেশনে লেখা হয়, এবং "local" প্রাইভেট এজেন্টের জন্য একটি গ্রেট ডোমেইন।
- Program: এই জব ডেসক্রিপশন যেই স্ক্রিপ্ট লঞ্চ করে তার ফুল পাথ।
- RunAtLoad: স্ক্রিপ্ট কখন রান করা উচিত সেটি বর্ণনা করে। এখানে কিছু অপশন রয়েছে:
- RunAtLoad: জব ডেফিনিশন লোড হয়ে যাওয়ার সাথে সাথে রান করে। প্রতি লোডে একবার রান করে।
- StartInterval: প্রতি n সেকেন্ডে জব শুরু করুন। নিচের উদাহরণ প্রতি ৭২০০ সেকেন্ড বা প্রতি ২ ঘন্টায় জব রান করবে।
<key>StartInterval</key> <integer>7200</integer>
- StartCalendarInterval: নির্দিষ্ট সময় এবং তারিখে জব রান করুন। নিচের কোড প্রতিদিন সকাল ৯টায় জব রান করবে।
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>
এজেন্ট বনাম ডেমন (Agents vs. daemons)
একবার আপনি আপনার জব ডেসক্রিপশন লিখলে, আপনাকে সেটি উপযুক্ত ডিরেক্টরিতে সেভ করতে হবে।
launchd আরও এজেন্ট এবং ডেমনকে আলাদা করে। একটি এজেন্ট লগড-ইন ইউজারের বिहälfte চলে, যখন একটি ডেমন রুট ইউজারের বিহälfte চলে। এর মানে, আপনি যদি একটি স্ক্রিপ্টকে নির্দিষ্ট ইউজার অ্যাকাউন্টে সীমাবদ্ধ করতে চান, আপনি একটি এজেন্ট ব্যবহার করতে পারেন। আপনি যদি কেউ লগড-ইন থাকুক না কেন কিছু চালাতে চান, আপনি একটি ডেমন ব্যবহার করবেন।
এজেন্ট এবং ডেমনের পার্থক্য এগুলো কম্পিউটারে কোথায় সেভ করা হয় সেটির থেকে আয়ত্ত:
- "~/Library/LaunchAgents" - লগড-ইন ইউজারের বিহälfte চলে
- "/Library/LaunchDaemons" - রুট ইউজারের বিহälfte চলে
আপনাকে আপনার plist সঠিক লোকেশনে সেভ করতে হবে।
launchctl-এ জব লোড করা
একবার আপনি আপনার স্ক্রিপ্ট তৈরি করলে এবং আপনার এজেন্টকে সঠিক জায়গায় সেভ করলে, আপনাকে সেটি launchctl-এ লোড করতে হবে। এটি ভবিষ্যতে লগইনগুলোর সময় অটোমেটিক্যালি হবে।
launchctl-এ বর্তমানে কী চলছে সেটি দেখতে, টার্মিনালে launchctl list ব্যবহার করতে পারেন। এই বিশাল লিস্টকে আপনার স্ক্রিপ্টের জন্য grep করতে পারেন সেটিকে নিচের মত কিছু দিয়ে লেবেল করে:
launchctl list | grep local.restart
একটি স্ক্রিপ্ট লোড করতে, Terminal খুলুন এবং নিচের কমান্ড ব্যবহার করুন:
launchctl load ~/Library/LaunchAgents/local.restart.plist
launchctl কিউ থেকে স্ক্রিপ্ট রিমুভ করতে unload কমান্ড ব্যবহার করুন:
launchctl unload ~/Library/LaunchAgents/local.restart.plist
একটি জব লোড করলে সেটি launchd কিউতে রাখে, এবং জব তার লঞ্চ কন্ডিশনে নির্দিষ্ট সময়ে রান করবে। আপনি যদি একটি স্ক্রিপ্ট ইমিডিয়েটলি রান করতে চান অপরিহার্য, আপনাকে "start" কমান্ড ব্যবহার করা উচিত:
launchctl start local.restart
এই কমান্ড জবের লেবেল নেয় এবং শুধু কাজ করবে যদি জবটি ইতিমধ্যে launchctl-এ লোড করা থাকে।
উপসংহার
আপনি launchd ব্যবহার করে স্ক্রিপ্ট তৈরি করতে পারেন যেগুলো ফাইল ক্লিন আপ করে, আপনার সার্ভার শিডিউলে রিস্টার্ট করে, বা একটি নির্দিষ্ট ফাইল আসলে অ্যাপ্লিকেশন চালায়। launchd-র সম্পর্কে আরও বেশি জানতে, আপনি launchd টিউটোরিয়াল চেক আউট করতে পারেন।