खोल का उपयोग कर इनिट सिस्टम का पता लगाएं


90

यह ऑपरेटिंग सिस्टम का पता लगाने के लिए अधिक हो सकता है, लेकिन मुझे विशेष रूप से सिस्टम पर उपयोग में वर्तमान में इनिट सिस्टम की आवश्यकता है।

फेडोरा 15 और उबंटू अब सिस्टमड का उपयोग करते हैं, उबंटू अपस्टार्ट (15.04 तक लंबे समय तक डिफ़ॉल्ट) का उपयोग करता था, जबकि अन्य सिस्टम वी के रूपों का उपयोग करते हैं।

मेरे पास एक एप्लिकेशन है जिसे मैं क्रॉस-प्लेटफॉर्म डेमन बनने के लिए लिख रहा हूं। Init स्क्रिप्ट्स को गतिशील रूप से उत्पन्न किया जा रहा है जो उन मापदंडों के आधार पर होता है जिन्हें कॉन्फ़िगर किया जा सकता है।

मैं जो करना चाहता हूं, वह केवल उस विशेष init सिस्टम की स्क्रिप्ट उत्पन्न करता है जिसका वे उपयोग कर रहे हैं। इस तरह से स्थापित स्क्रिप्ट को रूट के रूप में मापदंडों के बिना यथोचित चलाया जा सकता है और डेमॉन को स्वचालित रूप से "इंस्टॉल" किया जा सकता है।

यह वही है जो मैं लेकर आया हूं:

  • / बिन में systemd, upstart, आदि के लिए खोजें
  • सिस्टमड, अपस्टार्ट आदि से तुलना करें
  • उपयोगकर्ता से पूछें

ऐसा करने का सबसे अच्छा क्रॉस / प्लेटफॉर्म तरीका क्या होगा?

संबंधित की तरह, क्या मैं * nix के बहुमत पर होने के लिए बैश पर निर्भर हो सकता हूं या यह वितरण / ओएस पर निर्भर है?

लक्ष्य प्लेटफ़ॉर्म:

  • मैक ओ एस
  • लिनक्स (सभी वितरण)
  • बीएसडी (सभी संस्करण)
  • सोलारिस, मिनिक्स और अन्य * निक्स

1
बस मेरे दो सेंट जोड़ने के लिए, FreeBSD पर डिफ़ॉल्ट रूप से बैश स्थापित नहीं है।
चिन्मय कांची

@tjameson, क्या आपको अधिक सीधा रास्ता मिला? मैं एक ही चीज की तलाश कर रहा हूं लेकिन यहां उत्तर सिर्फ दिशाएं हैं, प्रत्यक्ष उत्तर नहीं। विशेष रूप से 1) स्क्रिप्ट स्थानों पर खोज करने के लिए और 2) प्रभाव में init प्रणाली का पता लगाने के मामले में, वहाँ कई स्थापित कर रहे हैं (बैश सीधे जवाब दिया गया था)।
n611x007

3
@naxa - लघु उत्तर, नहीं। लंबे जवाब, आप बहुत दूर के साथ ps -p 1 -o command(वर्तमान के लिए मार्ग प्रिंट init) प्राप्त कर सकते हैं । आर्क लिनक्स और फेडोरा (आईआईआरसी) पर, यह systemdबाइनरी के लिए एक सहानुभूति है (शायद सभी systemdप्रणालियों पर समान )। ऑन upstart, init --helpउपयोग जानकारी प्रिंट करेगा, और मेरे बॉक्स पर, upstartयह उल्लेख किया गया है कि यह कहां कहता है कि किसे ईमेल करना है। FreeBSD (sysV) पर, यह एक त्रुटि लौटाएगा। अन्य प्रणालियों पर समान सुराग हो सकते हैं, लेकिन इस सवाल को पूछने के बाद, मैंने उन्हें सभी प्लेटफार्मों के लिए बस बनाने और प्रत्येक के लिए अलग-अलग पैकेज बनाने का फैसला किया है।
बीटगैमिट

महान जानकारी धन्यवाद! उस से रोकना मैंने सीखा है कि sudo lsof -a -p 1 -d txtऔर भी सटीक परिणाम दे सकता है। psआप एक मनमाना नाम प्रिंट कर सकते हैं, जबकि lsofआपको वास्तविक निष्पादन योग्य मार्ग मिलेगा। (मेरा प्रश्न देखें unix.stackexchange.com/questions/102453/… )
n611x007

1
लिंक किए गए प्रश्न में कोई भी उत्तर या टिप्पणी संबंधित नहीं है। समाधान आपके मामले पर भी लागू होना चाहिए।
मार्को

जवाबों:


30

दूसरे प्रश्न के लिए, उत्तर नहीं है और आपको पोर्टेबल शेल प्रोग्रामिंग के लिए संसाधन पर एक नज़र डालनी चाहिए ।

पहले भाग के लिए - सबसे पहले, आपको निश्चित रूप से सावधान रहना होगा। मैं कहूंगा कि यह सुनिश्चित करने के लिए कई परीक्षण किए जाएंगे - क्योंकि तथ्य यह है कि किसी के पास सिस्टमड (पूर्व के लिए) स्थापित है, इसका मतलब यह नहीं है कि यह वास्तव में डिफ़ॉल्ट के रूप में उपयोग किया जाता है init। इसके अलावा, /proc/1/commदेखना भ्रामक हो सकता है, क्योंकि विभिन्न init प्रोग्राम्स की कुछ इंस्टॉलेशन स्वचालित रूप से /sbin/initसिम्लिंक हार्डलिंक या यहां तक ​​कि उनके मुख्य प्रोग्राम का बदला हुआ संस्करण भी बना सकती हैं ।

हो सकता है कि सबसे उपयोगी चीज init स्क्रिप्ट प्रकार को देखने के लिए हो सकता है - क्योंकि वे वही हैं जो आप वास्तव में बना रहे हैं, कोई फर्क नहीं पड़ता कि उन्हें क्या चलता है।

एक साइड नोट के रूप में, आपके पास OpenRC पर एक नज़र हो सकती है जिसका उद्देश्य इनिट स्क्रिप्ट की एक संरचना प्रदान करना है जो लिनक्स और बीएसडी दोनों प्रणालियों के साथ संगत है।


2
"इनिट स्क्रिप्ट्स प्रकार को देखो" से आपका क्या अभिप्राय है? अक्सर अलग init सिस्टम अपनी स्क्रिप्ट / फाइल को कहीं और रख देते हैं /etc/init, जैसे systemd उन्हें अंदर डालता है /etc/systemd। अगर मुझे इनकी स्क्रिप्ट पंसद करनी थी, तो इसमें थोड़ा समय लग सकता है। ओह, पोर्टेबल शेल प्रोग्रामिंग के लिए लिंक BTW के लिए धन्यवाद और धन्यवाद।
बीटगैमिट

1
मेरे कहने का मतलब है कि कुछ init कार्यान्वयन को विभिन्न init स्क्रिप्ट्स के प्रकारों और स्थानों (जैसे /etc/rc.d/या /etc/init.d/) का उपयोग करने के लिए समायोजित किया जा सकता है । और आपको दिए गए सिस्टम पर उपयोग की जाने वाली संरचना का उपयोग करने के लिए स्थापना समय पर अपने कार्यक्रम को ठीक से समायोजित करना चाहिए ।
rozcietrzewiacz

2
तो, क्या आप कह रहे हैं कि प्रोग्राम सिस्टम का पता लगाने के लिए कोई विश्वसनीय तरीका नहीं है? मापदंडों में उपयोगकर्ता पास होना निश्चित रूप से सुरक्षित है, लेकिन यदि उपयोगकर्ता कुछ भी पास नहीं करता है, तो अनुमान लगाने का सबसे अच्छा तरीका क्या होगा?
बीटगैमिट

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

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

58

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

तो उन लोगों के लिए जो यहां "ऑटो-डिटेक्ट" करना चाहते हैं, जो मैंने डिस्ट्रोस के सीमित सेट (अधिक नीचे) पर पाया है :

  • आप ऊपर से बता सकते हैं:

    [[ `/sbin/init --version` =~ upstart ]] && echo yes || echo no
  • आप से systemd बता सकते हैं:

    [[ `systemctl` =~ -\.mount ]] && echo yes || echo no
  • आप सेस-वी init बता सकते हैं:

    [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]] && echo yes

यहाँ निम्न कमांड लाइन के साथ मेरे प्रयोग हैं:

if [[ `/sbin/init --version` =~ upstart ]]; then echo using upstart;
elif [[ `systemctl` =~ -\.mount ]]; then echo using systemd;
elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then echo using sysv-init;
else echo cannot tell; fi

ec2 उदाहरणों पर (मैं हमारे पूर्व AMI आईडी सहित):

  • आर्चलिनक्स: सिस्टमड का उपयोग करके ( 2012.10.06 से )
  • CentOS6.4 ami-52009e3b: upstart का उपयोग करना
  • CentOS7 ami-96a818fe: सिस्टमड का उपयोग करना
  • डेबियन 6 ami-80e915e9: sysv-init का उपयोग करना
  • डेबियन 7.5 ami-2c886c44: sysv-init का उपयोग करना
  • डेबियन 7.6 जीसीई कंटेनर-वीएम: sysv-init का उपयोग करना
  • RHEL 6.5 ami-8d756fe4: अपस्टार्ट का उपयोग करना
  • SLES 11 ami-e8084981: sysv-init का उपयोग करना
  • Ubuntu 10.04 ami-6b350a02: upstart का उपयोग करना
  • Ubuntu 12.04 ami-b08b6cd8: upstart का उपयोग करना
  • Ubuntu 14.04 ami-a427efcc: upstart का उपयोग करना
  • Ubuntu 14.10 और छोटी: systemd का उपयोग करना
  • AWS linux 2014.3.2 ami-7c807d14: upstart का उपयोग करना
  • Fedora 19 ami-f525389c: systemd का उपयोग करना
  • Fedora 20 ami-21362b48: सिस्टमड का उपयोग करना

बस स्पष्ट होने के लिए: मैं यह दावा नहीं कर रहा हूं कि यह मूर्खतापूर्ण है! , यह लगभग निश्चित रूप से नहीं है। यह भी ध्यान दें कि सुविधा के लिए मैं बैश रेगेक्सप मैचों का उपयोग करता हूं, जो हर जगह उपलब्ध नहीं हैं। उपरोक्त मेरे लिए अभी काफी अच्छा है। हालाँकि, यदि आपको कोई ऐसा डिस्ट्रो मिल जाता है, जहाँ वह विफल हो जाता है, तो कृपया मुझे बताएं और मैं इसे ठीक करने की कोशिश करूंगा यदि कोई EC2 AMI है जो समस्या को पुन: उत्पन्न करता है ...


5
Systemd प्रलेखन ( sd_booted (3) ) के अनुसार, systemd की जाँच करने का सही तरीका यह है कि निर्देशिका /run/systemd/systemमौजूद है या नहीं।
रॉबी बसाक

1
मैं इस पता लगाने के लिए जोड़ रहा हूँ launchd, macOS पर init सिस्टम: [[ $(ps 1) =~ 'launchd' ]] && echo yes || echo noएक macBookPro, macOS Sierra संस्करण 10.12 पर परीक्षण किया गया
टोनी

मैं बिजीबॉक्स भी if [ -h /sbin/init -a $(readlink /sbin/init | grep busybox | wc -l) -gt 0 ]; then echo yes; else echo no; fi
जोड़ूंगा

18

प्रक्रियाओं का उपयोग करना

की एक जोड़ी से उत्पादन को देखते हुए psआदेशों के विभिन्न संस्करणों का पता लगा सकते systemdऔर upstartहै, जो इतनी तरह तैयार किया जा सकता है:

कल का नवाब

$ ps -eaf|grep '[u]pstart'
root       492     1  0 Jan02 ?        00:00:00 upstart-udev-bridge --daemon
root      1027     1  0 Jan02 ?        00:00:00 upstart-socket-bridge --daemon

systemd

$ ps -eaf|grep '[s]ystemd'
root         1     0  0 07:27 ?        00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
root       343     1  0 07:28 ?        00:00:03 /usr/lib/systemd/systemd-journald
root       367     1  0 07:28 ?        00:00:00 /usr/lib/systemd/systemd-udevd
root       607     1  0 07:28 ?        00:00:00 /usr/lib/systemd/systemd-logind
dbus       615     1  0 07:28 ?        00:00:13 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

उस प्रक्रिया के नाम पर ध्यान देना जो PID # 1 भी संभावित रूप से प्रकाश को बहा सकता है जिस पर init प्रणाली का उपयोग किया जा रहा है। फेडोरा 19 पर (जो उपयोग करता है systemd, उदाहरण के लिए:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:27 ?        00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 20

नोटिस यह नहीं है init। उपस्टार्ट के साथ उबंटू पर यह अभी भी है /sbin/init

$ ps -efa|grep init
root         1     0  0 Jan02 ?        00:00:03 /sbin/init

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

सामान्य

$ (ps -eo "ppid,args" 2>/dev/null || echo "ps call error") \
    | awk 'NR==1 || $1==1' | less
 PPID   COMMAND
    1   /lib/systemd/systemd-journald
    1   /lib/systemd/systemd-udevd
    1   /lib/systemd/systemd-timesyncd

Ppid 1 (init प्रक्रिया के बच्चे) के साथ प्रक्रियाओं को देखें। (कुछ) बच्चे प्रक्रिया नाम उपयोग में init प्रणाली को इंगित कर सकते हैं।

फाइल सिस्टम

यदि आप initनिष्पादन योग्य से पूछताछ करते हैं , तो आप इससे कुछ जानकारी भी प्राप्त कर सकते हैं। बस --versionआउटपुट पार्स करना । उदाहरण के लिए:

कल का नवाब

$ sudo /sbin/init --version
init (upstart 1.5)
Copyright (C) 2012 Scott James Remnant, Canonical Ltd.

This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.

systemd

$ type init
init is /usr/sbin/init

ध्यान दें: तथ्य यह initहै कि इसके मानक स्थान में नहीं है एक संकेत / बताओ का एक सा है। यह हमेशा /sbin/initsysvinit सिस्टम पर स्थित है ।

sysvinit

$ type init
init is /sbin/init

यह भी:

$ sudo init --version
init: invalid option -- -
Usage: init 0123456SsQqAaBbCcUu

निष्कर्ष

इसलिए ऐसा करने का कोई एक तरीका नहीं प्रतीत होता है, लेकिन आप चेक का एक सूट तैयार कर सकते हैं, जो आपके द्वारा उपयोग किए जा रहे इनविट सिस्टम को काफी हद तक आत्मविश्वास से परिपूर्ण करेगा।


कैसे के बारे में:pgrep systemd >/dev/null && echo init system: systemd
मार्को

धन्यवाद, यह वही है जो मैं देख रहा था: init सिस्टम को निर्धारित करने की कोशिश करने के लिए कुछ कदम उठाने के लिए।
2036 पर user369450

1
PID # 1 जरूरी नहीं है कि /usr/lib/systemd/systemdअगर systemd का उपयोग किया जाता है, तो यह एक गलत धारणा है। उदाहरण के लिए, मेरे सिस्टम पर, PID # 1 है /sbin/init(मैं सिस्टमड का उपयोग करता हूं)। यह वितरण पर निर्भर है।
मार्को

मेरे कुबंटू 15.04 इंस्टॉलेशन पर मुझे सिस्टमड और सिसविनीट दोनों दिखाई देते हैं। पता नहीं क्यों या इसका क्या मतलब है, बस कह रहे हैं .. pgrep systemd >/dev/null && echo init system: systemd -> init system: systemdऔरtype init -> init is /sbin/init
डॉटनेटकारपेंटर

12

यह कुशल नहीं है, लेकिन मुझे लगता है कि यह काम करता है।

strings /sbin/init | grep -q "/lib/systemd" && echo SYSTEMD
strings /sbin/init | grep -q "sysvinit" && echo SYSVINIT
strings /sbin/init | grep -q "upstart" && echo UPSTART

यह एक से अधिक स्ट्रिंग्स मैच होने पर अधिक पंक्तियों को प्रिंट करेगा, जिसका अनुवाद "अनुमान नहीं लगा सकता" हो सकता है। Grep में उपयोग किए गए स्ट्रिंग्स को थोड़ा संशोधित किया जा सकता है लेकिन जब निम्न ओएस में परीक्षण किया गया तो मुझे हमेशा एक पंक्ति मिली।

  • आरएचईएल 6.4 [UPSTART]
  • आरएचईएल ईएस 4 (नहाट अपडेट 7) [SYSVINIT]
  • Ubuntu 16.04.1 LTS [SYSTEMD]
  • Ubuntu 14.04.2 LTS [UPSTART]
  • फेडोरा रिलीज़ 23 (ऑनलाइन शेल) [SYSTEMD]
  • डेबियन GNU / Linux 7 (ऑनलाइन शेल) [SYSTEMD]

एक ही समाधान का एक अधिक सरलीकृत दृष्टिकोण (लेकिन यह पहले मैच में रुक जाता है)

strings /sbin/init |
  awk 'match($0, /(upstart|systemd|sysvinit)/) { print toupper(substr($0, RSTART, RLENGTH));exit; }'

अच्छा पहला जवाब। unix.se में आपका स्वागत है!
ओलिवियर दुलक

मैंने अभी एक Gentoo डिफ़ॉल्ट डॉकटर छवि पर OpenRC के साथ इसे स्थापित करने की कोशिश की, और यह SYSVINIT लौटा। Wiki.gentoo.org/wiki/Comparison_of_init_systems के अनुसार Gentoo के लिए डिफ़ॉल्ट OpenRC है, लेकिन ऐसा लगता है कि OpenRC sysvinit का उपयोग करता है। जब मैं OpenRC कमांड प्राप्त करने का प्रयास करता हूं तो मुझे "आप OpenRC सेवा को एक सिस्टम पर चलाने का प्रयास कर रहे हैं, जिस पर Openrc ने बूट नहीं किया है।" क्या sysvinit का उपयोग करके उचित और OpenRC के बीच अंतर करने का कोई तरीका है?
ट्यूडर

9

कभी-कभी इसका उपयोग करना जितना आसान होता है ls :

$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 juin  25 12:04 /sbin/init -> /lib/systemd/systemd

मुझे लगता है कि अगर /sbin/initएक प्रतीकात्मक लिंक नहीं है, तो आपको अन्य उत्तरों में निम्नलिखित सुझावों की जांच करनी होगी।


3
  1. यह विशिष्ट-विशिष्ट पैकेज हैं। सिर्फ इनिट सिस्टम का पता लगाने की तुलना में सॉफ्टवेयर को ठीक से स्थापित करने के लिए बहुत कुछ है। कई डिस्ट्रोस SysVinit का उपयोग करते हैं, लेकिन उनमें से सभी अपनी init स्क्रिप्ट उसी तरह नहीं लिखते हैं। इसे हल करने का उचित तरीका सभी अलग-अलग वेरिएंट को शामिल करना है और फिर इसे आरएमओ डिस्ट्रो के लिए विशिष्ट-विशिष्ट निर्भरता के नाम के साथ कल्पना फ़ाइलों का उपयोग करके बंडल करना है, उपयुक्त आधारित सिस्टम के लिए डिबेट फ़ाइलें, आदि लगभग सभी डिस्ट्रो में किसी प्रकार का पैकेज विनिर्देश है लिख सकते हैं कि निर्भरता, स्क्रिप्ट, init स्क्रिप्ट आदि शामिल हैं। यहां पहिया का फिर से आविष्कार न करें।

  2. नंबर जो हमें वापस लाता है 1. यदि आपको बैश की जरूरत है तो यह एक निर्भरता होनी चाहिए। आप इस चेक को अपनी कॉन्फ़िगर स्क्रिप्ट के हिस्से के रूप में निर्दिष्ट कर सकते हैं, लेकिन यह पैकेज विवरण में भी होना चाहिए।

संपादित करें: अपने कॉन्फ़िगर स्क्रिप्ट जैसे --with upstartया पर झंडे का उपयोग करें --without sysvinit। एक डिफ़ॉल्ट डिफ़ॉल्ट चुनें, फिर जो स्क्रिप्ट आपके सॉफ़्टवेयर को अन्य डिस्ट्रोस के लिए पैकेज करती है, वह अन्य विकल्पों के साथ इसे चलाना चुन सकती है।


Hmph, इसलिए ऐसा लग रहा है कि मेरे पास 'एक स्क्रिप्ट के लिए उन सभी को हल करने के लिए एक स्क्रिप्ट' नहीं हो सकती। मैंने बहुत सारे प्रोग्राम देखे हैं जो क्रॉस-प्लेटफ़ॉर्म सामान को संभालने के लिए ऑटोकॉन्फ़ या इसी तरह का उपयोग करते हैं, लेकिन ऐसा नहीं लगता है कि यह मेरे आवेदन के लिए सही उपकरण है। क्या प्रत्येक प्लेटफ़ॉर्म के लिए संस्करण बनाए रखना वास्तव में एकमात्र विश्वसनीय समाधान है?
बीटगैमिट

उन सभी पर शासन करने के लिए एक इंस्टॉलेशन स्क्रिप्ट एक BadIdea है। यह काम करता है की तुलना में अधिक स्थानों पर विफल रहता है। जहाँ तक जाता है ऑटोकॉन्फ़ अच्छा है। सॉफ्टवेयर के अपने अंत को यथासंभव सामान्य रखने पर कड़ी मेहनत करें और वैकल्पिक पैकेज को अपने पैकेज में शामिल करें। कई बड़े डिस्ट्रो के लिए पैकेज स्पेसिफिकेशन सेट करें। यदि आपका सॉफ़्टवेयर अच्छा है, तो आप अन्य लोगों को आपकी मदद कर सकते हैं ताकि इसे अन्य प्रणालियों के लिए पैक किया जा सके।
कालेब

@tjameson: मुझे एहसास हुआ कि मैं सबसे महत्वपूर्ण बिट भूल गया। इस तरह की बात आमतौर पर कॉन्फ़िगर स्क्रिप्ट में पारित स्विच के साथ की जाती है। प्रत्येक डिस्ट्रो के बिल्ड / पैकेज रूटीन अलग-अलग स्विच को कॉल कर सकते हैं, और आपके कॉन्फ़िगर / बनाने के लिए केवल यह जानना होगा कि यह किस स्विच को पारित किया गया था, सभी संभव सॉफ़्टवेयर कॉन्फ़िगरेशन का पता नहीं लगा।
कालेब

@ कालेब- हाँ, मेरे पास पहले से ही वहाँ तर्क है, लेकिन अच्छी पकड़ है। मैं एक समझदार प्रणाली का उपयोग करने के लिए एक रास्ते का अनुमान लगाने के लिए उम्मीद कर रहा था एक समझदार डिफ़ॉल्ट की तुलना में।
बीटगैमिट

2

Gentoo पर, pid 1 पर एक नज़र डालें:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4216   340 ?        Ss    2013   0:57 init [3]

यदि यह है init, तो init सिस्टम है OpenRC। यदि यह है systemd, तो init सिस्टम है systemd

आप के साथ Gentoo का पता लगा सकते हैं [ -f /etc/gentoo-release ]

Gentoo पर एक अन्य विधि का उपयोग करना है profile-config show, जो दिखाएगा कि उपयोग में डिफ़ॉल्ट प्रोफ़ाइल क्या है। दो सिरों के सिवाय सभी प्रोफाइल / systemd OpenRC init का उपयोग करते हैं। ध्यान रखें, ये केवल एक डिफ़ॉल्ट के प्रतिनिधि हैं और यह संभव है कि उपयोगकर्ता ने उस डिफ़ॉल्ट को ओवरराइड करने के लिए कदम उठाए हैं और यह वास्तव में उपयोग में आने वाले इनगर का संकेत नहीं हो सकता है।


गूंगा प्रश्न, लेकिन मैं पीआईडी ​​1 के लिए कैसे जांच करूं?
फहीम मीठा

PID द्वारा चयन pकरने के लिए विकल्प (समान -pऔर --pid) का उपयोग करें। उपरोक्त स्निपेट वास्तव में इसके लिए आउटपुट है ps u --pid 1
जोस एम। बेनिजेट

2

डेबियन / sbin / init पर आपके डिफ़ॉल्ट init के लिए एक सिमलिंक है

ls -l /sbin/init

आपको वह जानकारी देगा जिसकी आपको तलाश है।

$ ls -l /sbin/init 
lrwxrwxrwx 1 root root 20 nov 18 13:15 /sbin/init -> /lib/systemd/systemd

1
ऐसा नहीं। उपस्टार्ट के साथ उबंटू 14.04 पर, यह एक सिमलिंक नहीं है।
मुरु

एक और init सिस्टम स्थापित करें और फिर से जांचें।
rmorelli74

और initमैं Ubuntu 14.04 पर कौन सा अन्य स्थापित कर सकता हूं?
मुरु

... क्यों नहीं sysv या systemd?
rmorelli74

1
मैं नीचा दिखाना नहीं चाहता, मैं सिर्फ यह बताना चाहता हूं कि यह किस संस्करण पर लागू होता है। (और शायद ही अलग तरीके से व्यक्त "डेबियन-आधारित" से "डेबियन", इतना है कि यह सही हो जाता है।)
muru


2

फ़ाइल डिस्क्रिप्टर का निरीक्षण करने में भी मदद मिल सकती है। और यह वास्तव में init चल रहा है (डेबियन खिंचाव वर्तमान में अधिक init सिस्टम स्थापित करने की अनुमति देता है) :-)

$ ls -l /proc/1/fd |grep systemd
lrwx------ 1 root root 64 srp 14 13:56 25 -> /run/systemd/initctl/fifo
lr-x------ 1 root root 64 srp 14 13:56 6 -> /sys/fs/cgroup/systemd

$ ls -l /proc/1/fd |grep /run/initctl # sysvinit
lrwx------ 1 root root 64 srp 14 14:04 10 -> /run/initctl

$ ls -l /proc/1/fd |grep upstart
l-wx------ 1 root root 64 srp 13 16:09 13 -> /var/log/upstart/mysql.log.1 (delete
l-wx------ 1 root root 64 srp 13 16:09 9 -> /var/log/upstart/dbus.log.1 (deleted)

$ ls -l /proc/1/fd # busybox
total 0
lrwx------    1 root     root          64 Jan  1 00:00 0 -> /dev/console
lrwx------    1 root     root          64 Jan  1 00:00 1 -> /dev/console
lrwx------    1 root     root          64 Jan  1 00:00 2 -> /dev/console

बिजीबॉक्स की जांच करने का संभवत: सुरक्षित तरीका होगा check /proc/1/exe, क्योंकि बिजीबॉक्स आमतौर पर सिमिलिंक का उपयोग करता है:

$ ls -l /proc/1/exe 
lrwxrwxrwx    1 root     root          0 Jan  1 00:00 /proc/1/exe -> /bin/busybox

तो जाँच हो सकती है:

{ ls -l /proc/1/fd |grep -q systemd && echo "init: systemd"; } || \
{ ls -l /proc/1/fd |grep -q /run/initctl && echo "init: sysvinit"; } || \
{ ls -l /proc/1/fd |grep -q upstart && echo "init: upstart"; } || \
{ ls -l /proc/1/exe |grep -q busybox && echo "init: busybox"; } || \
echo "unknown init"

साथ ही सिस्टमड के साथ सिस्टम में आमतौर पर डायरेक्टरी होती है /run/systemd/system
पाविक

2

अन्य प्रणालियों के बारे में पता नहीं है तो डेबियन (wheezy) / या Ubuntu (14.10।) लेकिन मैं सादे पुराने fileकमांड के साथ ऐसे मुद्दों का परीक्षण करता हूं ।

file /sbin/init

इसे दे दें:

/sbin/init: symbolic link to 'upstart'

डेबियन सिस्टम systemd(जैसे सिड) इसे दिखाते हैं:

# file /sbin/init 
/sbin/init: symbolic link to /lib/systemd/systemd

आपने किस प्रणाली पर इसका परीक्षण किया? डेबियन / उबंटू जैसी कोई चीज नहीं है और यह डेबियन पर काम नहीं करता है। क्या आपने इसे उबंटू पर आजमाया?
terdon

इस भ्रम के लिए क्षमा करें, मेरा मतलब है डेबियन (wheezy) / या Ubuntu (14.10।)। डेबियन पर आउटपुट: file /sbin/init /sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0x8c68a736c6a4e6fadf22d5ac9debf11e79c6bdcd, stripped इसका मतलब है कि हम यहां SYSV का उपयोग करते हैं। Ubuntu के लिए आउटपुट मेरे उत्तर में दिखाया गया है।
zzeroo

वास्तव में, इसलिए आपका समाधान केवल तभी काम करता है जब कोई अपस्टार्ट और उबंटू का उपयोग कर रहा हो।
terdon

@terdon: सिस्टम (RHEL, फेडोरा) पर सिस्टमड चल रहा है, यह "प्रतीकात्मक लिंक ... सिस्टमड" लौटाता है; सिस्टम (उबंटू) पर ऊपर की ओर चल रहा है, यह "प्रतीकात्मक लिंक को अपस्टार्ट" देता है; सिस्टम (आरएचईएल, उबंटू, डेबियन) पर चल रहे एसआईएसवी में यह "निष्पादन योग्य" है। हालांकि यह शायद ही एक व्यापक सर्वेक्षण है, और यह विधि स्पष्ट रूप से 100% मूर्ख नहीं है, यह "केवल अपस्टार्ट और उबंटू" के बजाय "कम से कम प्रमुख डिस्ट्रोस के लिए काम करता है" के लिए स्पष्ट रूप से बहुत करीब है!
psmears

1
@psmears यदि यह कुछ systemd सिस्टम के लिए भी काम करता है, तो यह वास्तव में बेहतर है (लेकिन इस उत्तर में उल्लेख नहीं किया गया है)। मैंने अभी-अभी डेबियन रनिंग सिसविनीट, और तीन यूबंटस (10.04,12.04 और 14.04, सभी रनिंग अपस्टार्ट) पर परीक्षण किया और file /sbin/initसभी प्रणालियों पर "निष्पादन योग्य" लौटाया। यह सेंटोस 5.8, एसएलईएस 10, उबंटू 8.04 पर भी समान रूप से लौटाता है, मूल रूप से हर एक प्रणाली जिसे मैं अपने हाथों पर प्राप्त कर सकता हूं। इसलिए, जहां तक ​​मैं बता सकता हूं कि यह अपस्टार्ट और उबंटू के लिए भी काम नहीं करता है।
टेराडॉन

2

मुझे भी यही समस्या थी, और कुछ रेडहैट / सेंटोस / डेबियन / उबंटू / टकसाल मशीनों में बहुत सारे परीक्षण किए। यह वही है जो मैंने अच्छे परिणामों के साथ समाप्त किया है।

  1. PID 1 के साथ निष्पादन योग्य का नाम खोजें:

    ps -p 1

    यदि यह systemd या Upstart है, तो समस्या हल हो गई है। यदि यह "init" है, तो यह एक अपलिंक नाम के अलावा सिमिलिंक या कुछ और हो सकता है। आगे बढ़ें।

  2. निष्पादन योग्य के लिए वास्तविक मार्ग खोजें (केवल रूट के रूप में काम करें):

    ls -l `which init`

    यदि initउपस्टार्ट या सिस्टमड के लिए सिम्लिंक है, तो समस्या हल हो गई है। अन्यथा, यह लगभग निश्चित है कि आपके पास SysV init है। लेकिन यह एक गलत निष्पादन योग्य हो सकता है। आगे बढ़ें।

  3. उस पैकेज को ढूंढें जो निष्पादन योग्य प्रदान करता है। दुर्भाग्य से, यह डिस्ट्रो-निर्भर है:

    dpkg-query -S (executable real path) # Debian  
    rpm -qf (executable real path) # RedHat  

फिर, यदि आप स्क्रिप्ट करना चाहते हैं कि (सबसे मजेदार हिस्सा, IMHO), ये मेरे वन-लाइनर्स हैं (रूट के रूप में चलाएँ):

ls -l $(which $(ps -p 1 o comm)) | awk '{ system("dpkg-query -S "$NF) }' # Debian  

ls -l $(which $(ps -p 1 o comm)) | awk '{ system("rpm -qf "$NF) }' # RedHat  

1
निर्दिष्ट सभी ऑपरेटिंग सिस्टम में dpkg या rpm नहीं है (यह समस्या केवल आपके उत्तर, BTW के लिए विशिष्ट नहीं है)।
टोबी स्पाइट

@ टोबी-स्पाइट हाँ, ज़रूर। नोट मैंने अपने उत्तर में ऐसा कहा है, केवल सीमा स्पष्ट करने के लिए।
इमर्सन प्राडो

चरण 3 के लिए, आप init --versionजानकारी प्राप्त करने के लिए दौड़ सकते हैं ।
जर्नो

1

यह कुछ init सिस्टम के लिए वास्तव में आसान है। सिस्टमड के लिए:

test -d /run/systemd/system

अपस्टार्ट के लिए:

initctl --version | grep -q upstart

किसी और चीज के लिए, आप बस डिस्ट्रो (ओएस एक्स पर लॉन्चड, डेबियन पर सिसविनीट, जेंटू पर ओपनआरसी) के आधार पर मान सकते हैं।


"मानो डिस्ट्रो पर आधारित" डेबियन के लिए काम नहीं करता है, जहां कम से कम तीन अलग-अलग inits का समर्थन किया जाता है ...
Toby Speight

1

यह पता लगाने के लिए एक बैश स्क्रिप्ट है। यह इस समय केवल अपस्टार्ट और सिस्टमड के लिए जाँच करता है, लेकिन विस्तार करना आसान होना चाहिए। मैंने इसे कोड से लिया है मैंने DisplayLink ड्राइवर इंस्टॉल स्क्रिप्ट में योगदान दिया है

detect_distro()
{
  # init process is pid 1
  INIT=`ls -l /proc/1/exe`
  if [[ $INIT == *"upstart"* ]]; then
    SYSTEMINITDAEMON=upstart
  elif [[ $INIT == *"systemd"* ]]; then
    SYSTEMINITDAEMON=systemd
  elif [[ $INIT == *"/sbin/init"* ]]; then
    INIT=`/sbin/init --version`
    if [[ $INIT == *"upstart"* ]]; then
      SYSTEMINITDAEMON=upstart
    elif [[ $INIT == *"systemd"* ]]; then
      SYSTEMINITDAEMON=systemd
    fi
  fi

  if [ -z "$SYSTEMINITDAEMON" ]; then
    echo "WARNING: Unknown distribution, assuming defaults - this may fail." >&2
  else
    echo "Init system discovered: $SYSTEMINITDAEMON"
  fi
}

1
मुझे लगता है कि /procइसे नीचे लिनक्स (यदि उपयुक्त रूप से कॉन्फ़िगर किया गया है) और एक या दो अन्य के साथ संबंधों का उपयोग - यह निश्चित रूप से सार्वभौमिक से बहुत दूर है।
टॉबी स्पाइट

1

Systemd बनाम initd का परीक्षण करते समय बहुत अधिक अनुकूलता नुकसान होते हैं। यह वास्तव में OpenSuSE 42.1 पर काम करता है:ps --pid 1 | grep -q systemd && echo 'systemd' || echo 'init'


1

के लिए systemd:

if [[ `systemctl is-system-running` =~ running ]]; then echo using systemd; fi

डाउनवोटिंग क्योंकि यह उत्तर कई मौजूदा उत्तरों की तुलना में कोई नई या अलग जानकारी प्रदान नहीं करता है।

@ संजयेंद्र मुझे यह स्निपेट कहीं और नहीं दिखता। यह अपने आप में पूर्ण नहीं है, और संभवतः उत्तर के खिलाफ एक टिप्पणी के रूप में बेहतर होगा। unix.stackexchange.com/a/164092/100397 TvE
roaima

ओह यू आर राइट @roaima। यह दूसरों की तरह बिल्कुल नहीं है। मैंने एक बहुत अधिक विशिष्ट स्ट्रिंग के लिए पृष्ठ खोजा :)
jayhendren

1
यह अब तक का सबसे सही उत्तर है :)
जैक ओ'कॉनर

1

मेरा समाधान: आईडी 1 के साथ प्रक्रिया के रूप में चल रहे कमांड की जांच करें।

case `cat /proc/1/comm` in
    init)    echo Init ;;
    systemd) echo SystemD ;;
    # add here other patterns
    *)       echo "unknown: '`cat /proc/1/comm`'" ;;
esac

फिलहाल मेरे पास केवल Init और SystemD मशीनों तक पहुंच है, इसलिए मैं यह नहीं बता सकता कि Upstart या macOS (OS X) का पता कैसे लगाया जाएगा, लेकिन मैं खोज करता रहूंगा।


0
check(){
    if hash systemctl 2>/dev/null;
    then
        echo "there is systemd"
    fi

    if hash initctl 2>/dev/null;
    then
        echo "there is upStart"
    fi

    if [ -f "/etc/inittab"];
    then
        echo "there is systemV"
    fi
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.