मुझे कैसे पता चलेगा कि मैं किस संस्करण का उपयोग कर रहा हूं?


14

मैं ऐसे वातावरण में काम करता हूँ जहाँ हम Red Hat Enterprise Linux 5 से धीरे धीरे RHEL 6 में मशीनों को परिवर्तित कर रहे हैं।

मुझे अपनी स्क्रिप्ट की आवश्यकता है कि आरएचईएल 6 मशीनों पर कुछ अलग करने के लिए जो वर्तमान में आरएचईएल 5 मशीनों पर किया जा रहा है।

व्यावहारिक समाधान रनटाइम पर जांचना और आरएचईएल 5 पर कुछ कमांड चलाना, आरएचईएल 6 पर अन्य और दोनों पर कुछ करना है।

इसका एक व्यावहारिक उदाहरण यह है कि हम पर्यावरण मॉड्यूल का उपयोग कर रहे हैं और मेरी .bashrcएक module load gitपंक्ति भी शामिल है , लेकिन RHEL6 मशीनों पर यह कमांड त्रुटियां हैं:

RHEL6 system, git should be installed - not loading module

मॉड्यूलफाइल में देखने से मुझे निम्नलिखित कोड मिलते हैं:

set redhatrelease [eval exec "cat /etc/redhat-release"]
if { [regexp -nocase {release 6} $redhatrelease] } {
  puts stderr "\n\t RHEL6 system, git should be installed - not loading module\n"
} else {
  ...
}

ऐसा लगता है कि मैं क्या चाहता हूं, लेकिन मैं कुछ छोटा होने की उम्मीद कर रहा था।

तो, bash स्क्रिप्ट में RHEL6 से RHEL5 को बताने का सबसे आसान तरीका क्या है?

आदर्श रूप से यह विभिन्न प्रमुख संस्करणों में मजबूत होना चाहिए, लेकिन मामूली रिलीज संख्या में भिन्नता के प्रति सहनशील होना चाहिए।


lsb_releaseकाम करता है ? ( -rआपको बस नंबर देने की जरूरत है, -aउपलब्ध सब कुछ देखने की भी कोशिश करें ) यदि ऐसा है, तो वह भी क्रॉस-वेंडर है।
derobert

सुविधाओं के लिए परीक्षण करें, प्लेटफ़ॉर्म नहीं। RHEL7 के बाहर आने पर आपका प्लेटफ़ॉर्म टेस्ट आज टूट जाएगा, और इससे पहले टूट सकता है जब RHEL 6.next बाहर आता है, शायद इसलिए कि उन्होंने आगे एक EL5 सुविधा को 6.x में पोर्ट करा दिया ताकि शिकायतों को दूर किया जा सके। इसलिए, यदि आपकी स्क्रिप्ट को gitबैश मॉड्यूल की आवश्यकता है , तो आप यह जांचते हैं कि क्या यह कॉल करने से पहले मौजूद है। जब / यदि यह बाद में दिखाई देता है, तो आपके चेक के परिणाम बदल जाते हैं, इसलिए अचानक कोई अतिरिक्त प्रयास किए बिना, सुविधा काम करना शुरू कर देती है।
वॉरेन यंग

@WarrenYoung - धन्यवाद, लेकिन मैं यहाँ एक sysasmin नहीं हूँ, सिर्फ एक केन्द्र प्रबंधित आरएचईएल तैनाती का एक उपयोगकर्ता। हमारे सभी RHEL5 मशीनें अनिवार्य रूप से एक ही छवि हैं, सभी RHEL6 मशीनें ditto हैं, इसलिए मेरे लिए प्रमुख संशोधन जानना पर्याप्त है। यह देखते हुए कि हम केवल आरएचईएल 6 को स्थानांतरित करने की योजना के चरणों में हैं, मुझे लगता है कि आरएचई 7 के बारे में चिंता करने से पहले हमें कुछ समय लगेगा। * 8 ')
मार्क बूथ

@derobert - नहीं, RHEL5 और 6 पर lsb_release -rअन्य पाठ भी शामिल हैं, जैसे Release: 5.8। जैसा कि डेनिस कार्सेमेकर बताते हैं , यदि आप lsb_release -rsइसके बजाय उपयोग करते हैं, तो आपको सिर्फ नंबर मिलता है।
मार्क बूथ

यह भी देखें serverfault.com/questions/89654/what-version-of-rhel-am-i-use - RPM के साथ इसे करने के लिए एक टिप है जब lsb स्थापित नहीं है।
दान प्रातः

जवाबों:


10

आप lsb_releaseकमांड का उपयोग भी कर सकते हैं । यदि आप पहले से ही निश्चित हैं कि यह RHEL है, तो प्रमुख संस्करण संख्या है:

majversion=$(lsb_release -rs | cut -f1 -d.)

Centos और Redhat पर काम करता है, Redhat के Oracle लिनक्स रिलीज़ पर विफल रहता है। lsb_release नहीं मिला।
user959690

यह उत्तर अब पुराना लगता है। मैं केवल lsb_releaseअपने आरएचईएल / सेंटो 5 मशीनों पर पाता हूं। यह कहीं 6 या 7. पर पाया जाना है
डेल एंडरसन

आपको redhat-lsb-core पैकेज स्थापित करने की आवश्यकता हो सकती है।
डेनिस करसेमेकर

15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

यह सबसे आसान तरीका होगा जिसके बारे में मैं सोच सकता हूं।


सेंटोस और आरएचईएल की हर भिन्नता के लिए मैं अपनी इन्वेंट्री में 5 से 7 के विपरीत, इसके विपरीत काम करता हूं lsb_release जिसके केवल 5 के लिए काम करने लगता है
डेल एंडरसन

4

उपयोग rpm -q |grep redhat-release-server

/etc/redhat-releaseफ़ाइल एक व्यवस्थापक एक वास्तविक ओएस नवीनीकरण करते समय बिना तीसरे पक्ष के सॉफ्टवेयर स्थापित करने के लिए देख द्वारा संपादित किया जा सकता था।


1
क्या आपका मतलब rpm -qaइसके बजाय था rpm -q? -qस्वयं का उपयोग करके एक क्वेरी तर्क की आवश्यकता होती है।
डेल एंडरसन

@ डेल एंडरसन, धन्यवाद, यह केवल एक ही है जिसने मेरे लिए काम किया था, 7.4 पर, और मैं इसे 7.4तब तक नहीं जानता था जब तक मैं इसके साथ नहीं चला-qa
ब्रायन थॉमस

2

आप /etc/issueफ़ाइल के बजाय फ़ाइल का उपयोग करके कई लिनक्स डिस्ट्रोस के लिए इस पर विस्तार कर सकते हैं /etc/redhat-release


2
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)

rpm -q --queryformat '%{RELEASE}' rpm कुछ ऐसा प्रिंट करता है 25.el7 । फिर अंतिम अंक (ओं) को लेने की बात है। आरएचईएल 5,6,7 और फेडोरा 24 पर परीक्षण किया गया।

जैसा कि दूसरों ने बताया, lsb-versionस्थापित नहीं किया जा सकता है। इसके अतिरिक्त, कम से कम एक RHEL5 प्रणाली है जिसमें redhat-release-serverपैकेज स्थापित नहीं है ।


धन्यवाद, इसे ऊपर उठाया जाना चाहिए, क्योंकि यह हमेशा काम करता है और वास्तव में वांछित संख्या देता है।
फ़िफी

1

इस परिणाम को प्राप्त करने का एक और सटीक तरीका यह है। आरएचईएल में कर्नेल पैकेज में स्ट्रिंग 'एलएन' शामिल है, जहां एन ओएस के प्रमुख संस्करण का प्रतिनिधित्व करता है। इस प्रकार, कोई आरएचईएल के संस्करण की पहचान करने के लिए निम्नलिखित कमांड चला सकता है:

# uname -r | sed 's/^.*\(el[0-9]\+\).*$/\1/'

यह एक स्ट्रिंग, "el5", "el6" या "el7" लौटाएगा, जो दिए गए होस्ट पर मिलान स्ट्रिंग के आधार पर होगा।


मैं CentOS और RedHat के मिश्रण का उपयोग कर रहा हूँ, संस्करण 5-7 और उत्तर वास्तव में सभी संस्करणों पर काम करता है: uname -r | sed 's /^.* (el [0-9] \ +)। * $ / \ 1 /'
WallStProg

0

मैंने जोर्डनम के उत्तर का उपयोग करके समाप्त कर दिया, लेकिन अपने स्वयं के एक मोड़ को जोड़ दिया।

क्योंकि मैं नहीं चाहता था कि मेरे सभी rhel6 कमांड्स एक साथ हों और मेरे सभी rhel5 कमांड्स एक साथ हों, लेकिन अपने स्वयं के सेक्शन में इंटरलीव्ड हों, और मैं नहीं चाहता था कि मैं इस कोड को हर बार स्विच करने के लिए तैयार करूं, जिसके बजाय मैं स्विच करना चाहता था। इसे किया:

if   grep -q -i "release 6" /etc/redhat-release ; then
  rhel6only=1
elif grep -q -i "release 5" /etc/redhat-release ; then
  rhel5only=1
else
  echo "Running neither RHEL6.x nor RHEL 5.x !"
fi

इस तरह, मैं चीजों को कर सकता था जैसे:

# JDK
[ $rhel5only ] && module load java/6
[ $rhel6only ] && module load java/7

# Eclipse
module load eclipse

# Python
[ $rhel5only ] && module load python/2
[ $rhel6only ] && module load python/3

आदि।


0

यदि आपका आगे का इरादा संदर्भ-आधार पर मॉड्यूलफाइल्स का प्रबंधन करना है, तो मेरा सुझाव है कि आप ईज़ीबिल्ड और कुछ संबंधित लॉजिक की जाँच करें, पायथन प्रारूप में रहते हैं:


0

यहां बताई गई सभी विधियां पाठ फ़ाइलों पर निर्भर करती हैं, और जैसे कि भ्रामक हो सकती हैं। सही पहुंच वाले किसी व्यक्ति ने / etc / redhat-release, / etc / issue आदि की सामग्री को बदल दिया है, यहां तक ​​कि इस जानकारी को केवल बाधित करने के लिए भी। एक और अधिक विश्वसनीय विधि में कर्नेल रिलीज़ को जानना आमतौर पर आरएचईएल के प्रत्येक संस्करण पर रेड हैट द्वारा प्रदान किया जाएगा:

  • RHEL4 कर्नेल 2.6.9-X का उपयोग करता है
  • RHEL5 कर्नेल 2.6.18-X का उपयोग करता है
  • RHEL6 कर्नेल 2.6.32-X का उपयोग करता है
  • RHEL7 कर्नेल 3.10.0-X का उपयोग करता है

अब तक के लिए, आप चल रहे कर्नेल रिलीज़ का पता लगा सकते हैं uname -r। की तर्ज पर कुछ चलाकर आप कट्टर हो सकते हैं

uname -r | awk -F- '{print $1}'

यह कर्नेल के बारे में विशिष्ट जानकारी देगा, जैसा कि उपरोक्त तालिका में है। यदि आप लगातार कर्नेल रिलीज़ का उपयोग करते हैं, तो आप अन्य वितरणों में समानताएं चलाने में सक्षम हो सकते हैं।


2
-1। व्यवस्थापक कर्नेल को आसानी से अपडेट करने का निर्णय ले सकता है।
ओलिवर गोंडस्टा

0

RHEL 6 ने / etc / system-release-cpe फ़ाइल जोड़ी है। इसमें एक- :सस्पेक्टेड स्ट्रिंग होता है जो कुछ इस तरह दिख सकता है

# cat /etc/system-release-cpe
cpe:/o:redhat:enterprise_linux:6computenode:ga:computenode

अब आरएचईएल संस्करण और आरएचईएल संस्करण प्राप्त करने के लिए खेतों को $ 5 और $ 7 खींचने के लिए पर्याप्त है।

# will be 7 or 6, does not work for 5 as file is missing there
RHEL_VERSION_MAJOR=$(cat /etc/system-release-cpe | awk -F: '{ print $5 }' | grep -o ^[0-9]*)
RHEL_VARIANT=$(cat /etc/system-release-cpe | awk -F: '{ print $7 }')

0

आरएचईएल 6 से शुरू, सबसे संक्षिप्त तरीका होगा:

cat /etc/system-release-cpe | cut -d ':' -f5

अगर वह "सबसे संक्षिप्त" होना था और आप cut -d: -f5 /etc/system-release-cpuUUOC से बचेंगे। हालाँकि, प्रश्न RHEL 5 से 6. के बारे में संक्रमण के बारे में पूछ रहा था। यदि यह केवल RHEL 6 से काम करता है तो क्या यह प्रश्न आवश्यकताओं को पूरा करने में विफल रहता है?
रोमीमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.