লিনাক্সের কোন সংস্করণ চলছে তা আমি কীভাবে জানতে পারি?


29

কখনও কখনও আপনার স্ক্রিপ্টগুলি বিভিন্ন লিনাক্সের ক্ষেত্রে আলাদা আচরণ করতে হবে। লিনাক্সের কোন সংস্করণটি কোনও স্ক্রিপ্ট চলছে তা আমি কীভাবে নির্ধারণ করতে পারি?


1
সংস্করণ অনুসারে, আপনি কার্নেল সংস্করণটি বোঝাতে চান? কি বিতরণ? ডিস্ট্রো সংস্করণ?
ক্রিস আপচর্চ 23

2
আমি নিশ্চিত যে jldugger সিস্টেমটি কোন বিতরণ পরিবারে চলছে তা সন্ধান করতে চায় wants কোনও স্ক্রিপ্ট কার্নেল সংস্করণ দ্বারা প্রভাবিত হওয়ার সম্ভাবনা নেই যদিও এটি কিছু / সিএস বা / প্রোক স্টাফের উপর নির্ভর করে - এবং তারপরে কার্নেলের চেয়ে বিতরণের উপর ভিত্তি করে ধরে নেওয়া সহজ হয়।
মিহাই লিম্বান

উত্তর:


27

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

উদাহরণস্বরূপ, আপনি যদি কোনও প্যাকেজ ইনস্টল করতে চান, আপনি ডিপিকিজি বা আরপিএমের অস্তিত্ব পরীক্ষা করে আপনি ডেবিয়ান-জাতীয় সিস্টেম বা রেডহ্যাট-জাতীয় সিস্টেমে আছেন কিনা তা সনাক্ত করতে পারেন (প্রথমে ডিপিকিগির জন্য চেক করুন, কারণ ডেবিয়ান মেশিনগুলি থাকতে পারে তাদের উপর আরপিএম কমান্ড ...)। এটি কোনও ডেবিয়ান বা রেডহ্যাট সিস্টেম কিনা তা ভিত্তিতে নয়, তার ভিত্তিতে কী করবেন সে বিষয়ে সিদ্ধান্ত নিন। এইভাবে আপনি কোনও ডাইরিভেটিভ ডিস্ট্রোসকে স্বয়ংক্রিয়ভাবে সমর্থন করবেন যা আপনি স্পষ্টভাবে প্রোগ্রাম করেননি Oh ওহ, এবং যদি আপনার প্যাকেজটির নির্দিষ্ট নির্ভরতা প্রয়োজন হয় তবে তাদের জন্যও পরীক্ষা করুন এবং ব্যবহারকারীরা কী অনুপস্থিত তা জানাতে দিন।

অন্য একটি উদাহরণ নেটওয়ার্ক ইন্টারফেসের সাথে ফিডিং। একটি / ইত্যাদি / নেটওয়ার্ক / ইন্টারফেস ফাইল বা একটি / ইত্যাদি / সিসকনফিগ / নেটওয়ার্ক-স্ক্রিপ্ট ডিরেক্টরি আছে কিনা সেটির উপর ভিত্তি করে কী করতে হবে এবং সেখান থেকে যান।

হ্যাঁ, এটি আরও বেশি কাজ, তবে যদি না আপনি ওয়েব বিকাশকারীরা বিগত দশক বা তারও বেশি সময় ধরে সমস্ত ভুলের পুনঃনির্মাণ না করতে চান, আপনি এটি শুরু থেকেই এটি স্মার্ট উপায়ে করবেন।


1
(এই উত্তরের প্রসারিত করা) কিছু পরিস্থিতিতে বৈশিষ্ট্য-সনাক্তকরণ আরও ভাল, তবে আপনি যে বৈশিষ্ট্যগুলি সনাক্ত করেছেন সেগুলি থেকে বিতরণটি কখনও চেষ্টা করবেন না এবং অনুমান করবেন না তা নিশ্চিত করুন! উত্তরটি অপ্রকাশিত করবেন না এবং কোন ফাইলগুলি / ইত্যাদির উপর ভিত্তি করে প্ল্যাটফর্মটি রেডহ্যাট কিনা তা নিয়ে কাজ করবেন না। যদি আপনার সত্যিই বিতরণের নাম প্রয়োজন হয় তবে lsb_re দয়া করে পরীক্ষা করুন (বা / ইত্যাদি / redhat-released, এবং আরও)।
নিকোলাস উইলসন

36

কোনও ক্রস-বিতরণের উপায় নেই। যাহোক:

  • রেডহ্যাট এবং বন্ধুরা: পরীক্ষা করুন /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

বাশ প্রম্পটে


সম্পাদনা করুন: দয়া করে নোট করুন যে এই স্ক্রিপ্টটিতে মূল সুবিধার দরকার নেই। আমি আপনাকে অনুরোধ করছি যে এটি এটিকে মূল হিসাবে চালাবেন না। কোনও কিছুর ক্ষতি করা উচিত নয়, তবে প্রয়োজন নেই।


সিভিএস লগে কোনও প্রাসঙ্গিক মেলিং তালিকা পোস্টের লিঙ্ক খুঁজে পেয়েছি । আরআইপি স্ক্রিপ্ট স্প্যাগেটি মোড়কানোর জন্য দরকারী হওয়া উচিত।


আমি কেন তাকালাম না তবে এটি দেবিয়ান লেনির (5.0) থেকে প্রম্পটে ফিরে আসে।
গ্যারেথ

গ্যারেশু, আপনি কি আসলেই_ get_distrib_type ফাংশনটি শুরু করেছেন? আমি স্পষ্ট করতে পোস্টটি সম্পাদনা করেছি (নীচে দেখুন)
মিহাই লিম্বান

@ জিয়ারেসু: যদি উপরের সমস্যাটি না হয়ে থাকে তবে আপনি দয়া করে লগইন_বার্নিং_এমএসজি এবং ডেবিয়ান বিভাগে log_begin_msg প্রতিস্থাপনের চেষ্টা করতে পারেন? ফাংশনটির নাম ভুল হতে পারে। যাই হোক না কেন, যদি সেই ফাংশনটি Htere না করা হত তবে এটি "অজানা" ফিরে আসা উচিত।
মিহাই লিম্বান

@ মিহাই দোহ! দুঃখিত। স্ক্রিপ্টটি সঠিকভাবে পড়েনি। খুব তাড়াতাড়ি ছিল, কফি নেই। আমার ক্ষমা চাই। গাইরেসু @ ডিবিয়ান: ~ / বিন $ উত্স সার্ভার_ভার্সন.শ গায়ারসু @ ডেবিয়ান: ~ / বিন $ get_distrib_type ডেবিয়ান
গ্যারেথ

@ জিয়ারেসু: ধন্যবাদ! ভালো অর্থাৎ সাহায্য করা উচিত jldugger জানাতে চাই যে, এটা পাশাপাশি :) ডেবিয়ান উপর কাজ করে
Mihai Limbăşan

17

আপনি চালিয়ে কার্নেল সংস্করণটি খুঁজে পেতে পারেন uname -a, ডিস্ট্রো সংস্করণটি ডিস্ট্রোর উপর নির্ভরশীল finding

উবুন্টু এবং অন্য কয়েকটি ওএস-এ আপনি চালাতে lsb_release -aবা / ইত্যাদি / lsb_re দয়া করে পড়তে পারেন

দেবিয়ান সংস্করণটি / etc / debian_version এ সঞ্চয় করে


Lsb_re দয়া করে জন্য +1 (সঠিক প্যাকেজ ইনস্টল করা থাকলে রেড হ্যাট ডেরিভেটিভগুলিতেও কাজ করে)
জোশ কেলি

কেবলমাত্র 'lsb_release -d' বর্ণনার জন্য।
ফ্লিকফার্লি

6

বেশিরভাগ ডিস্ট্রোর নির্দিষ্ট বন্টন নির্ধারণের একটি অনন্য পদ্ধতি রয়েছে।

উদাহরণ স্বরূপ:

Redhat (And derivatives): /etc/redhat-release

SUSE: /etc/SUSE-release

লিনাক্স স্ট্যান্ডার্ড বেস বা এলএসবি নামে পরিচিত একটি স্ট্যান্ডার্ড রয়েছে । এটি সংজ্ঞায়িত করে যে এখানে / etc / lsb-release নামক একটি ফাইল বা lsb_release নামক একটি প্রোগ্রাম থাকা উচিত যা আপনার লিনাক্স ডিস্ট্রো সম্পর্কিত তথ্য প্রতিধ্বনিত করবে।

lsb_release -a

এবং অবশ্যই, lsb_releaseCentOS 6 এ বিদ্যমান নেই
জাস্টিন

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 এ ডিফল্ট হয়।
heinrich5991

5

অন্যান্য উত্তরগুলির সাথে যুক্ত: আপনি যদি কেবল একটি ফাইলকে বিশ্লেষণ করতে চান তবে বেশিরভাগ ডিসট্রসগুলি / ইত্যাদি / ইস্যুর মাধ্যমে টিটি লগইনকে ব্যক্তিগতকরণ করে:

সুস লিনাক্স এন্টারপ্রাইজ সার্ভার 10 এসপি 2 (i586) - কার্নেল (r () l) এ আপনাকে স্বাগতম।

এবং হ্যাঁ আমি জানি এটি সাবঅপটিমাল। :)


এটি উপ-অনুকূল হতে পারে, তবে এটি একই জায়গায় রয়েছে।
ব্র্যাড গিলবার্ট

4

এই ধরণের আবিষ্কারের জন্য ফ্যাক্টর হ'ল একটি কার্যকর সরঞ্জাম, যদিও এটি সম্ভবত উপরে বর্ণিত কয়েকটি পদ্ধতি ব্যবহার করে এবং এর জন্য রুবি প্রয়োজন।


2

আপনাকে যা করতে হবে তা হ'ল uname -aআপনার প্রিয় শেলটি টাইপ করা। এটি কার্নেলের নাম এবং সংস্করণটি মুদ্রণ করবে।


2

আমি খুঁজে পেয়েছি যে cat /etc/*release*প্রায় সবসময় কাজ করে।


2

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


2

আপনি এর মাধ্যমে সংস্করণটিও পেতে পারেন

cat /proc/version

ণ; / p &:

লিনাক্স সংস্করণ 2.6.17-13mdv (rtp@octopus.mandriva.com) (gcc সংস্করণ 4.1.2 20070302 (প্রিরিলেস) (4.1.2-1mdv2007.1)) # 1 এসএমপি শুক্র 23 মার্চ 19:03:31 ইউটিসি 2007


1

লিনাক্সের সংস্করণটি একটি কঠিন প্রশ্ন। আমরা যদি এটি সরুভাবে দেখি তবে আমাদের কাছে কার্নেল সংস্করণটি পাওয়া যাবে " 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...


-1

ফিউশনআইভেন্টরি একটি ক্রস-প্ল্যাটফর্ম লাইটওয়েট ইনভেন্টরি সরঞ্জাম যা অনেক লিনাক্স ডিস্ট্রোগুলিতে কিন্তু বিএসডি, উইন্ডোজ, ম্যাকস এক্স এবং অন্যান্য সংযোগগুলিতেও এই তথ্য পেতে পারে।

যদি উপলভ্য থাকে তবে তারা lsb_release(উপরে কয়েকবার উল্লিখিত হিসাবে) ব্যবহার করে, তবে না থাকলে তাদের কাছে ডিস্ট্রো নাম এবং সংস্করণ পরীক্ষা করার জন্য ফাইল এবং নিয়মিত এক্সপ্রেশনগুলির একটি খুব দরকারী তালিকা রয়েছে: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / ফিউশনআইভেনটিরি / এজেন্ট / টাস্ক / ইনভেন্টরি / ইনপুট / লিনাক্স / ডিস্ট্রো / ননএলএসবি.এমপি # এল 16

আমি এই যুক্তি দিয়ে আপনার নিজস্ব স্ক্রিপ্টগুলি পুনর্নির্মাণ না করে এই তথ্যটি পেতে নিজেই ফিউশনআইভেন্টরি ব্যবহার করার পরামর্শ দেব, কারণ তাদের সম্প্রদায়টি এই কার্যকারিতাটি আপ টু ডেট রাখবে। আপনি হয় এজেন্টটি নিজস্বভাবে ব্যবহার করতে পারেন (এটি কোনও এক্সএমএল / জেএসএন ফাইল আউটপুট করে যা সহজে পার্স করা যায়) বা আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনার নেটওয়ার্কের জিএলপিআই বা রডারের মতো মেশিনগুলি পরিচালনা করতে আরও বিস্তৃত সমাধান দিয়ে এটি তৈরি করতে পারেন ।


পার্ল মডিউলগুলির বহিরাগত নির্ভরতা না থাকলে এটি একটি ভাল সমাধান হবে
উইল শেপার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.