मुझे कैसे पता चलेगा कि लिनक्स का कौन सा संस्करण चल रहा है?


29

कभी-कभी आपकी स्क्रिप्ट को अलग-अलग लिनक्स पर अलग तरह से व्यवहार करने की आवश्यकता होती है। मैं यह कैसे निर्धारित कर सकता हूं कि लिपि का कौन सा संस्करण स्क्रिप्ट पर चल रहा है?


1
संस्करण से, क्या आपका मतलब कर्नेल संस्करण है? क्या वितरण? दूर का संस्करण?
क्रिस अपचर्च

2
मुझे यकीन है कि jldugger यह जानना चाहता है कि सिस्टम किस वितरण परिवार को चला रहा है। यह संभावना नहीं है कि एक स्क्रिप्ट कर्नेल संस्करण से प्रभावित होगी जब तक कि यह कुछ / sys या / proc सामान पर निर्भर न हो - और तब भी आमतौर पर कर्नेल की तुलना में वितरण पर आधारित अनुमान लगाना आसान होता है।
Mihai Limbăşan

जवाबों:


27

डिस्ट्रो पर आधारित कोशिशों और मान्यताओं को मत बनाइए जो आप कर सकते हैं और नहीं कर सकते हैं, इस तरह से पागलपन निहित है (यह भी देखें "उपयोगकर्ता एजेंट का पता लगाना")। इसके बजाय, यह पता लगाएं कि क्या यह है कि आप जो करना चाहते हैं वह समर्थित है, और जो भी कमांड या फ़ाइल स्थान आप उपयोग करना चाहते हैं वह कैसे किया जाता है।

उदाहरण के लिए, यदि आप एक पैकेज स्थापित करना चाहते हैं, तो आप यह पता लगा सकते हैं कि आप डेबियन-जैसी प्रणाली या रेडहैट जैसी प्रणाली के लिए dpkg या rpm के अस्तित्व की जाँच करके देख रहे हैं (पहले dpkg के लिए जाँच करें, क्योंकि डेबियन मशीनें हो सकती हैं) उन पर आरपीएम कमांड ...)। इसके आधार पर अपना निर्णय लें कि क्या करना है, न कि यह कि यह डेबियन या रेडहैट प्रणाली है। इस तरह आप स्वचालित रूप से किसी भी व्युत्पन्न डिस्ट्रोस का समर्थन करेंगे जो आपने स्पष्ट रूप से प्रोग्राम में नहीं किया था। ओह, और यदि आपके पैकेज को विशिष्ट निर्भरता की आवश्यकता है, तो उन लोगों के लिए भी परीक्षण करें और उपयोगकर्ता को बताएं कि वे क्या याद कर रहे हैं।

एक और उदाहरण नेटवर्क इंटरफेस के साथ भरा हुआ है। यह पता लगाने के लिए कि वहाँ क्या है / a / etc / network / interfaces file या / etc / sysconfig / network-script डायरेक्टरी पर आधारित है, और वहाँ से क्या करना है।

हां, यह अधिक काम है, लेकिन जब तक आप उन सभी गलतियों का रीमेक नहीं बनाना चाहते जो वेब डेवलपर्स ने पिछले एक दशक या उससे अधिक समय से की हैं, तो आप इसे शुरू से ही सही तरीके से करेंगे।


1
(इस उत्तर पर विस्तार करते हुए) फ़ीचर-डिटेक्शन कुछ स्थितियों में बेहतर है, लेकिन सुनिश्चित करें कि आप कभी भी कोशिश न करें और आपके द्वारा खोजी जाने वाली सुविधाओं से वितरण का अनुमान लगाएं! उत्तर को गलत न समझें और यह पता लगाएँ कि क्या प्लेटफ़ॉर्म RedHat के आधार पर है कि कौन सी फाइलें / आदि हैं। यदि आपको वास्तव में वितरण नाम की आवश्यकता है, तो lsb_release (या / etc / redhat-release, और इसी तरह) की जाँच करें।
निकोलस विल्सन

36

कोई क्रॉस-वितरण तरीका नहीं है। तथापि:

  • रेडहैट और दोस्त: /etc/redhat-releaseसामग्री की जांच करें
  • डेबियन: परीक्षण के लिए /etc/debian_version, सामग्री की जाँच करें
  • मांडवी और मित्र: /etc/versionसामग्री की जाँच करें, के लिए
  • स्लैकवेयर: टेस्ट के लिए /etc/slackware-version, सामग्री की जाँच करें

आदि आम तौर पर बोल रहा है, के लिए जाँच करें /etc/*-releaseऔर /etc/*-version


संपादित करें: मेरी एक पुरानी (1+ वर्ष) की स्क्रिप्ट मिली जो चारों ओर पड़ी हुई थी कि मैंने वर्षों से एक साथ मिलकर काम किया होगा (इसका प्रभावशाली CVS लॉग 6 वर्ष पीछे जा रहा है।) यह अब और के रूप में ठीक से काम नहीं कर सकता है। के खिलाफ परीक्षण करने के लिए स्थापित विकृतियों को खोजने के लिए परेशान नहीं होना चाहिए, लेकिन यह आपको एक अच्छा शुरुआती बिंदु प्रदान करना चाहिए। यह CentOS, Fedora और Gentoo पर ठीक काम करता है। ग्यारसु ने डेबियन लेनी पर इसका सफल परीक्षण किया।

#!/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
}

ध्यान दें कि यह केवल बैश में सही ढंग से काम करेगा। आप इसे अन्य गोले के लिए फिर से लिख सकते हैं।

कहा जा रहा है कि आप सुविधाओं के लिए परीक्षण करना चाहते हैं, वितरण के लिए नहीं। मैं इसे अब और उपयोग नहीं कर रहा हूं क्योंकि यह रखरखाव का बोझ बन गया है। क्रॉस-डिस्ट्रीब्यूशन टूल और सॉल्यूशंस पर भरोसा करना आसान है।


वैचारिक रूप से, यह क्या होता है:

  • एक ज्ञात, "सामान्य इनिट स्क्रिप्ट फ़ंक्शन" फ़ाइल के प्रकार में खींचो। वे वितरण-विशिष्ट हैं। यदि यह मौजूद नहीं है, तो अगले वितरण चेक पर जाएं।
  • उस मूल लिपि से एक विशिष्ट, ज्ञात-से-मौजूद, अक्सर-उपयोग किए जाने वाले और नाम बदला जाने वाले फ़ंक्शन के अस्तित्व की जांच करें। हम typeबैश बिलिन का उपयोग करते हैं । यदि वह प्रतीक एक फंक्शन है तो type -tरिटर्न functionकरता है। हम zzआउटपुट से प्रिपेंड करते हैं type -t 2>/dev/nullक्योंकि अगर नाम से परिभाषित नहीं किया गया है तो आउटपुट स्ट्रिंग खाली हो जाएगा और हमें ==ऑपरेटर को लापता बाएं हाथ के बारे में एक सिंटैक्स त्रुटि मिलेगी । यदि हमारे द्वारा अभी-अभी चेक किया गया नाम कोई फ़ंक्शन नहीं है, तो अगले वितरण चेक पर जाएं, अन्यथा हमें वितरण प्रकार मिला।
  • अंत में, वितरण प्रकार को प्रतिध्वनित करें ताकि फ़ंक्शन आउटपुट का उपयोग आसानी से एक मामले में किया जा सके .. esac ब्लॉक।

यदि आप इसे एक सीधी स्क्रिप्ट के रूप में चलाने का प्रयास कर रहे हैं, तो संपादित करें: इस स्क्रिप्ट को अन्य स्क्रिप्ट्स से प्राप्त या शामिल किया जाना चाहिए। यह अपने आप कुछ भी आउटपुट नहीं करता है अगर आप इसे चलाते हैं। इसका परीक्षण करने के लिए, इसे स्रोत करें और फिर फ़ंक्शन को लागू करें, जैसे:

source /path/to/this/script.sh
get_distribution_type

बैश प्रॉम्प्ट पर।


संपादित करें: कृपया ध्यान दें कि इस स्क्रिप्ट को मूल विशेषाधिकारों की आवश्यकता नहीं है। मेरा आपसे आग्रह है कि इसे जड़ के रूप में न चलाएं। कुछ भी नुकसान नहीं करना चाहिए, लेकिन कोई जरूरत नहीं है।


सीवीएस लॉग में एक प्रासंगिक मेलिंग सूची पोस्ट का लिंक मिला । इनग्रैट इनिट स्क्रिप्ट स्पेगेटी में उपयोगी होना चाहिए।


मैंने क्यों नहीं देखा लेकिन यह डेबियन लेन (5.0) पर संकेत देता है।
गैरेथ

gyaresu, क्या आपने वास्तव में get_distribution_type फ़ंक्शन को लागू किया है? मैं पोस्ट स्पष्ट करने के लिए संपादित किया है (नीचे देखें।)
मिहाई Limbăşan

@gyaresu: यदि ऊपर की समस्या नहीं थी, तो क्या आप कृपया log_begin_msg को Debian अनुभाग में log_warning_msg और पुनः प्रयास के साथ बदलने का प्रयास कर सकते हैं? फ़ंक्शन नाम गलत हो सकता है। किसी भी स्थिति में, यह "अज्ञात" वापस आ जाना चाहिए यदि वह फ़ंक्शन हेटर नहीं था, लेकिन फिर भी।
मिहाई लिम्बायसन

@ मिहाई दोह! माफ़ कीजिये। स्क्रिप्ट ठीक से नहीं पढ़ी। जल्दी थी, कॉफ़ी नहीं। मेरी क्षमा याचना gyaresu @ debian: ~ / bin $ source server_version.sh gyaresu @ debian: ~ / bin $ get_distribution_type debian
गैरेथ

@gyaresu: धन्यवाद! यह अच्छा है, यह जानने के लिए
बुजुर्गों की

17

आप कर्नेल संस्करण को चलाकर पा सकते हैं uname -a, डिस्ट्रो संस्करण ढूंढना डिस्ट्रो पर निर्भर है।

उबंटू और कुछ अन्य ओएस पर आप चला सकते हैं lsb_release -aया पढ़ सकते हैं / etc / lsb_release

डेबियन संस्करण को / etc / debian_version में संग्रहीत करता है


+1 के लिए lsb_release (सही पैकेज स्थापित होने पर रेड हैट डेरिवेटिव पर भी काम करता है)
जोश केली

केवल वर्णन के लिए 'lsb_release -ds'।
झिलमिलाहट

6

अधिकांश डिस्ट्रो के पास विशेष वितरण का निर्धारण करने की एक अनूठी विधि है।

उदाहरण के लिए:

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

SUSE: /etc/SUSE-release

वहाँ एक मानक है जिसे लिनक्स मानक बेस या एलएसबी के रूप में जाना जाता है । यह परिभाषित करता है कि एक फ़ाइल होनी चाहिए जिसे / etc / lsb-release या lsb_release नाम का एक प्रोग्राम होना चाहिए जो आपके linux distro के बारे में जानकारी वापस गूँजती हो।

lsb_release -a

और हां, lsb_releaseCentOS 6. पर मौजूद नहीं है
जस्टिन

6
python -c 'import platform ; print platform.dist()[0]'

कोड: http://hg.python.org/cpython/file/2.7/Lib/platform.py


महान विचार। मैं उपयोग करने का सुझाव python -c 'import platform; print(platform.dist()[0])'दूंगा, क्योंकि यह उस तरह से भी काम करता है जब सामान्य अजगर अजगर को बचाता है।
Heinrich5991

5

अन्य उत्तरों के अलावा: यदि आप केवल एक फ़ाइल को पार्स करना चाहते हैं, तो अधिकांश डिस्ट्रो ट्टी लॉगिन को / etc समस्या के माध्यम से वैयक्तिकृत करते हैं:

लिनक्स एंटरप्राइज सर्वर 10 SP2 (i586) - कर्नेल \ r (\ l) में आपका स्वागत है।

और हाँ, मुझे पता है कि यह सबॉप्टीमल है। :)


यह उप-इष्टतम हो सकता है, लेकिन यह उसी स्थान पर है।
ब्रैड गिल्बर्ट

4

फैक्टर इस तरह की खोज के लिए एक उपयोगी उपकरण है, हालांकि यह संभवतः ऊपर वर्णित कुछ तरीकों का उपयोग करता है, और रूबी की आवश्यकता होती है।


2

आपको बस uname -aअपने पसंदीदा शेल में टाइप करना है । यह कर्नेल नाम और संस्करण का प्रिंट आउट लेगा।


2

मैंने पाया है कि cat /etc/*release*लगभग हमेशा काम करता है।


2

मैं मार्क, एडम और मिहाई (अपर्याप्त प्रतिष्ठा के कारण वोट नहीं दे सकता) के साथ सहमत हूं। एलएसबी और इसके सापेक्ष एफएचएस पर आधारित समाधान अधिकांश वितरणों के साथ काम करेंगे और भविष्य में काम जारी रखने की संभावना है। LSB और FHS आपके मित्र हैं।


2

आप इसके द्वारा संस्करण भी प्राप्त कर सकते हैं

cat /proc/version

ओ / p:

लिनक्स संस्करण 2.6.17-13mdv (rtp@octopus.mandriva.com) (जीसीसी संस्करण 4.1.2 20070302 (प्रीलेरेज़) (4.1.2-1mdv2007.1) # 1 एसएमपी शुक्र मार्च 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

आप ग्रब मेनू भी देख सकते हैं, आमतौर पर आपको डिस्ट्रो / वर्जन की जानकारी का एक गुच्छा दिया जाता है :-)


-1

फ्यूजन इन्वेंटरी एक क्रॉस-प्लेटफ़ॉर्म लाइटवेट इन्वेंट्री टूल है जो कई लिनक्स डिस्ट्रोस पर बल्कि बीएसडी, विंडोज, मैकओएस एक्स और अन्य यूनियनों पर भी यह जानकारी प्राप्त कर सकता है।

यदि उपलब्ध हो, तो वे उपयोग करते हैं lsb_release(जैसा कि ऊपर कुछ बार उल्लेख किया गया है), लेकिन अगर उनके पास डिस्ट्रीक नाम और संस्करण की जांच करने के लिए फ़ाइलों और नियमित अभिव्यक्तियों की बहुत उपयोगी सूची नहीं है: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm # L16

मैं इस तर्क को प्राप्त करने के बजाय, इस जानकारी को प्राप्त करने के लिए FusionInventory का उपयोग करने की सलाह दूंगा, क्योंकि उनका समुदाय इस कार्यक्षमता को बनाए रखेगा। आप या तो एजेंट इस्तेमाल कर सकते हैं पर यह खुद है जैसे आपके नेटवर्क में मशीनों प्रबंधन के लिए एक व्यापक समाधान के साथ या यह जोड़ी (यह एक XML / JSON फ़ाइल जो पार्स करने के लिए आसान है आउटपुट) GLPI या पतवार अपनी आवश्यकताओं पर निर्भर करता है,।


यह एक अच्छा समाधान होगा यदि इसमें पर्ल मॉड्यूल की बाहरी निर्भरता नहीं थी
विल शेपर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.