কখনও কখনও আপনার স্ক্রিপ্টগুলি বিভিন্ন লিনাক্সের ক্ষেত্রে আলাদা আচরণ করতে হবে। লিনাক্সের কোন সংস্করণটি কোনও স্ক্রিপ্ট চলছে তা আমি কীভাবে নির্ধারণ করতে পারি?
কখনও কখনও আপনার স্ক্রিপ্টগুলি বিভিন্ন লিনাক্সের ক্ষেত্রে আলাদা আচরণ করতে হবে। লিনাক্সের কোন সংস্করণটি কোনও স্ক্রিপ্ট চলছে তা আমি কীভাবে নির্ধারণ করতে পারি?
উত্তর:
আপনি কী করতে পারেন এবং কী করতে পারবেন না তার উপর ভিত্তি করে ডিস্ট্রোর উপর ভিত্তি করে অনুমান করার চেষ্টা করবেন না এবং সে জন্য পাগলামিও রয়েছে ("ব্যবহারকারী এজেন্ট সনাক্তকরণ" দেখুন)। পরিবর্তে, আপনি যা করতে চান তা সমর্থিত কিনা এবং আপনি যে কোনও আদেশ বা ফাইলের অবস্থান ব্যবহার করতে চান তা এটি কীভাবে হয় তা সনাক্ত করুন।
উদাহরণস্বরূপ, আপনি যদি কোনও প্যাকেজ ইনস্টল করতে চান, আপনি ডিপিকিজি বা আরপিএমের অস্তিত্ব পরীক্ষা করে আপনি ডেবিয়ান-জাতীয় সিস্টেম বা রেডহ্যাট-জাতীয় সিস্টেমে আছেন কিনা তা সনাক্ত করতে পারেন (প্রথমে ডিপিকিগির জন্য চেক করুন, কারণ ডেবিয়ান মেশিনগুলি থাকতে পারে তাদের উপর আরপিএম কমান্ড ...)। এটি কোনও ডেবিয়ান বা রেডহ্যাট সিস্টেম কিনা তা ভিত্তিতে নয়, তার ভিত্তিতে কী করবেন সে বিষয়ে সিদ্ধান্ত নিন। এইভাবে আপনি কোনও ডাইরিভেটিভ ডিস্ট্রোসকে স্বয়ংক্রিয়ভাবে সমর্থন করবেন যা আপনি স্পষ্টভাবে প্রোগ্রাম করেননি Oh ওহ, এবং যদি আপনার প্যাকেজটির নির্দিষ্ট নির্ভরতা প্রয়োজন হয় তবে তাদের জন্যও পরীক্ষা করুন এবং ব্যবহারকারীরা কী অনুপস্থিত তা জানাতে দিন।
অন্য একটি উদাহরণ নেটওয়ার্ক ইন্টারফেসের সাথে ফিডিং। একটি / ইত্যাদি / নেটওয়ার্ক / ইন্টারফেস ফাইল বা একটি / ইত্যাদি / সিসকনফিগ / নেটওয়ার্ক-স্ক্রিপ্ট ডিরেক্টরি আছে কিনা সেটির উপর ভিত্তি করে কী করতে হবে এবং সেখান থেকে যান।
হ্যাঁ, এটি আরও বেশি কাজ, তবে যদি না আপনি ওয়েব বিকাশকারীরা বিগত দশক বা তারও বেশি সময় ধরে সমস্ত ভুলের পুনঃনির্মাণ না করতে চান, আপনি এটি শুরু থেকেই এটি স্মার্ট উপায়ে করবেন।
কোনও ক্রস-বিতরণের উপায় নেই। যাহোক:
- রেডহ্যাট এবং বন্ধুরা: পরীক্ষা করুন
/etc/redhat-release
, সামগ্রীগুলি পরীক্ষা করুন- ডেবিয়ান: পরীক্ষার জন্য
/etc/debian_version
, বিষয়বস্তু পরীক্ষা করুন- মান্দ্রিভা এবং বন্ধুরা: পরীক্ষা করুন
/etc/version
, সামগ্রীগুলি পরীক্ষা করুন- স্ল্যাকওয়্যার: পরীক্ষা করুন
/etc/slackware-version
, সামগ্রীগুলি পরীক্ষা করুন
ইত্যাদি সাধারণত জন্য ভাষী, চেক /etc/*-release
এবং /etc/*-version
।
সম্পাদনা: আমার একটি পুরানো (1+ বছর) বাশ স্ক্রিপ্ট পাওয়া গেছে যার চারপাশে আমি অবশ্যই একসাথে বছরের পর বছর ধরে আবদ্ধ হয়েছি (এটির একটি চিত্তাকর্ষক সিভিএস লগ 6 বছর পিছনে ফিরে যাচ্ছে।) এটি এখনকার মতো ঠিক মতো কাজ করতে পারে না এবং আমি পারি এর বিরুদ্ধে পরীক্ষার জন্য ইনস্টলড ডিগ্রোগুলি খুঁজে পেতে বিরক্ত করা হবে না তবে এটি আপনাকে একটি ভাল সূচনা পয়েন্ট সরবরাহ করবে। এটি সেন্টস, ফেডোরা এবং জেন্টুতে দুর্দান্ত কাজ করে। গায়ারসু এটি ডেবিয়ান লেনির উপর সফলভাবে পরীক্ষা করেছে।
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
নোট করুন যে এটি সম্ভবত ব্যাশে সঠিকভাবে কাজ করবে। আপনি অন্যান্য শাঁসের জন্য এটি আবার লিখতে পারেন।
বলা হচ্ছে, আপনি বিতরণের জন্য নয়, বৈশিষ্ট্যের জন্য পরীক্ষা করতে চাইতে পারেন। আমি এটি আর ব্যবহার করছি না কারণ এটি রক্ষণাবেক্ষণের বোঝা হয়ে দাঁড়িয়েছে। ক্রস-বিতরণ সরঞ্জাম এবং সমাধানগুলির উপর নির্ভর করা সহজ।
ধারণাগতভাবে, এটি যা করে তা ক্রমে:
- একটি পরিচিত, "সাধারণ init স্ক্রিপ্ট ফাংশন" ধরণের ফাইলটি টানুন। এগুলি বিতরণ-নির্দিষ্ট। যদি এটি বিদ্যমান না থাকে তবে পরবর্তী বিতরণ চেক এ যান।
- সেই নির্দিষ্ট স্ক্রিপ্ট থেকে একটি নির্দিষ্ট, জ্ঞাত-টু-অস্তিত্ব, প্রায়শই ব্যবহৃত এবং পুনরায় নামকরণের কার্যকারিতা হওয়ার সম্ভাবনা অস্তিত্ব পরীক্ষা করে দেখুন। আমরা
type
ব্যাশ বিল্টিন ব্যবহার করে এটি করি । প্রতীকটি যদি কোনও ফাংশন হয় তবেtype -t
ফিরে আসেfunction
। আমরাzz
আউটপুট থেকে প্রিপেন্ড করিtype -t 2>/dev/null
কারণ নামটি যদি সংজ্ঞায়িত না করা হয় তবে আউটপুট স্ট্রিংটি ফাঁকা থাকবে এবং==
অপারেটরের কাছে নিখোঁজ বাম হাতটি সম্পর্কে একটি সিনট্যাক্স ত্রুটি পাই । আমরা সন্ধান করা নামটি যদি ফাংশন না হয় তবে পরবর্তী বিতরণ চেক এড়িয়ে যান, অন্যথায় আমরা বিতরণের ধরণ খুঁজে পেয়েছি।- অবশেষে, বিতরণ প্রকারের প্রতিধ্বনি করুন যাতে কোনও ক্ষেত্রে ফাংশন আউটপুট সহজেই ব্যবহার করা যায় .. এসাক ব্লক।
আপনি যদি এটি সরাসরি স্ক্রিপ্ট হিসাবে চালানোর চেষ্টা করছেন তবে সম্পাদনা করুন: এই স্ক্রিপ্টটি অন্য স্ক্রিপ্ট থেকে উত্সাহিত বা অন্তর্ভুক্ত হওয়ার কথা। আপনি যেমনটি চালনা করেন এটি নিজে থেকে কিছু আউটপুট দেয় না। এটি পরীক্ষা করতে, এটি উত্স করুন এবং তারপরে ক্রিয়াকলাপটি শুরু করুন, যেমন:
source /path/to/this/script.sh
get_distribution_type
বাশ প্রম্পটে
সম্পাদনা করুন: দয়া করে নোট করুন যে এই স্ক্রিপ্টটিতে মূল সুবিধার দরকার নেই। আমি আপনাকে অনুরোধ করছি যে এটি এটিকে মূল হিসাবে চালাবেন না। কোনও কিছুর ক্ষতি করা উচিত নয়, তবে প্রয়োজন নেই।
সিভিএস লগে কোনও প্রাসঙ্গিক মেলিং তালিকা পোস্টের লিঙ্ক খুঁজে পেয়েছি । আরআইপি স্ক্রিপ্ট স্প্যাগেটি মোড়কানোর জন্য দরকারী হওয়া উচিত।
আপনি চালিয়ে কার্নেল সংস্করণটি খুঁজে পেতে পারেন uname -a
, ডিস্ট্রো সংস্করণটি ডিস্ট্রোর উপর নির্ভরশীল finding
উবুন্টু এবং অন্য কয়েকটি ওএস-এ আপনি চালাতে lsb_release -a
বা / ইত্যাদি / lsb_re দয়া করে পড়তে পারেন
দেবিয়ান সংস্করণটি / etc / debian_version এ সঞ্চয় করে
বেশিরভাগ ডিস্ট্রোর নির্দিষ্ট বন্টন নির্ধারণের একটি অনন্য পদ্ধতি রয়েছে।
উদাহরণ স্বরূপ:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
লিনাক্স স্ট্যান্ডার্ড বেস বা এলএসবি নামে পরিচিত একটি স্ট্যান্ডার্ড রয়েছে । এটি সংজ্ঞায়িত করে যে এখানে / etc / lsb-release নামক একটি ফাইল বা lsb_release নামক একটি প্রোগ্রাম থাকা উচিত যা আপনার লিনাক্স ডিস্ট্রো সম্পর্কিত তথ্য প্রতিধ্বনিত করবে।
lsb_release -a
lsb_release
CentOS 6 এ বিদ্যমান নেই
python -c 'import platform ; print platform.dist()[0]'
কোড: http://hg.python.org/cpython/file/2.7/ লাইব / প্ল্যাটফর্ম.পি
python -c 'import platform; print(platform.dist()[0])'
, কারণ এইভাবে এটি কাজ করে যদি সাধারণ অজগরটি পাইথন 3 এ ডিফল্ট হয়।
অন্যান্য উত্তরগুলির সাথে যুক্ত: আপনি যদি কেবল একটি ফাইলকে বিশ্লেষণ করতে চান তবে বেশিরভাগ ডিসট্রসগুলি / ইত্যাদি / ইস্যুর মাধ্যমে টিটি লগইনকে ব্যক্তিগতকরণ করে:
সুস লিনাক্স এন্টারপ্রাইজ সার্ভার 10 এসপি 2 (i586) - কার্নেল (r () l) এ আপনাকে স্বাগতম।
এবং হ্যাঁ আমি জানি এটি সাবঅপটিমাল। :)
আপনাকে যা করতে হবে তা হ'ল uname -a
আপনার প্রিয় শেলটি টাইপ করা। এটি কার্নেলের নাম এবং সংস্করণটি মুদ্রণ করবে।
আমি মার্ক, অ্যাডাম এবং মিহাইয়ের সাথে একমত হই (অপর্যাপ্ত সুনামের কারণে ভোট দিতে পারি না)। এলএসবি এবং এর সম্পর্কিত এফএইচএস ভিত্তিক সমাধানগুলি বেশিরভাগ বিতরণের সাথে কাজ করবে এবং ভবিষ্যতে কাজ চালিয়ে যাওয়ার সম্ভাবনা রয়েছে। এলএসবি এবং এফএইচএস আপনার বন্ধু।
লিনাক্সের সংস্করণটি একটি কঠিন প্রশ্ন। আমরা যদি এটি সরুভাবে দেখি তবে আমাদের কাছে কার্নেল সংস্করণটি পাওয়া যাবে " uname -r
"। বিতরণ সংস্করণ বেশিরভাগ অপ্রাসঙ্গিক। কিছু বিতরণ আরও ভাল (এন্টারপ্রাইজ বিতরণ যেমন রেডহাট এন্টারপ্রাইজ লিনাক্স)। জেন্টুর মতো অন্যান্য বিতরণগুলি মূলত লক্ষ্যবস্তুগুলি সরিয়ে নিয়ে যায় যার কোনও বুদ্ধিমান সংস্করণ নেই। যদি আপনাকে সংস্করণের উপর ভিত্তি করে জিনিসগুলি করতে হয়, তবে আপনার সাথে প্রাসঙ্গিক প্রধান উপাদানগুলি একবার দেখুন:
Component Version command
glibc /lib/libc.so.6
gcc gcc --version
X xdpyinfo
libX11 pkg-config --modversion x11
gtk+ pkg-config --modversion gtk+-2.0
qt-4 pkg-config --modversion QtCore
etc...
আপনি গ্রুব মেনুটিও পরীক্ষা করতে পারেন, সাধারণত আপনাকে একগুচ্ছ ডিস্ট্রো / সংস্করণ তথ্য দেয় :-)
ফিউশনআইভেন্টরি একটি ক্রস-প্ল্যাটফর্ম লাইটওয়েট ইনভেন্টরি সরঞ্জাম যা অনেক লিনাক্স ডিস্ট্রোগুলিতে কিন্তু বিএসডি, উইন্ডোজ, ম্যাকস এক্স এবং অন্যান্য সংযোগগুলিতেও এই তথ্য পেতে পারে।
যদি উপলভ্য থাকে তবে তারা lsb_release
(উপরে কয়েকবার উল্লিখিত হিসাবে) ব্যবহার করে, তবে না থাকলে তাদের কাছে ডিস্ট্রো নাম এবং সংস্করণ পরীক্ষা করার জন্য ফাইল এবং নিয়মিত এক্সপ্রেশনগুলির একটি খুব দরকারী তালিকা রয়েছে: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / ফিউশনআইভেনটিরি / এজেন্ট / টাস্ক / ইনভেন্টরি / ইনপুট / লিনাক্স / ডিস্ট্রো / ননএলএসবি.এমপি # এল 16 ।
আমি এই যুক্তি দিয়ে আপনার নিজস্ব স্ক্রিপ্টগুলি পুনর্নির্মাণ না করে এই তথ্যটি পেতে নিজেই ফিউশনআইভেন্টরি ব্যবহার করার পরামর্শ দেব, কারণ তাদের সম্প্রদায়টি এই কার্যকারিতাটি আপ টু ডেট রাখবে। আপনি হয় এজেন্টটি নিজস্বভাবে ব্যবহার করতে পারেন (এটি কোনও এক্সএমএল / জেএসএন ফাইল আউটপুট করে যা সহজে পার্স করা যায়) বা আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনার নেটওয়ার্কের জিএলপিআই বা রডারের মতো মেশিনগুলি পরিচালনা করতে আরও বিস্তৃত সমাধান দিয়ে এটি তৈরি করতে পারেন ।