শেল ব্যবহার করে সূচনা সিস্টেম সনাক্ত করুন


90

অপারেটিং সিস্টেম সনাক্তকরণে এটির সাথে আরও বেশি কিছু থাকতে পারে তবে বর্তমানে বিশেষভাবে সিস্টেমে ব্যবহৃত ইনপুট সিস্টেমটি আমার বিশেষভাবে প্রয়োজন।

ফেডোরা 15 এবং উবুন্টু এখন সিস্টেমড ব্যবহার করে, উবুন্টু আপস্টার্ট (15.04 অবধি দীর্ঘকালীন ডিফল্ট) ব্যবহার করতে ব্যবহৃত হয়, অন্যরা সিস্টেম ভি এর বিভিন্নতা ব্যবহার করে

আমার একটি অ্যাপ্লিকেশন রয়েছে যা আমি ক্রস-প্ল্যাটফর্ম ডেমন হিসাবে লিখছি। ডিগ্রি স্ক্রিপ্টগুলি কনফিগারেশনে পাস করা যেতে পারে এমন পরামিতিগুলির ভিত্তিতে গতিশীলভাবে তৈরি করা হচ্ছে।

আমি যা করতে চাই তা হ'ল তারা যে বিশেষ থিম সিস্টেমটি ব্যবহার করছে তা কেবলমাত্র স্ক্রিপ্ট তৈরি করে। এইভাবে ইনস্টল স্ক্রিপ্টটি রুট হিসাবে পরামিতি ছাড়াই যুক্তিসঙ্গতভাবে চালানো যেতে পারে এবং ডিমন স্বয়ংক্রিয়ভাবে "ইনস্টল" করা যায় can

এটিই আমি নিয়ে এসেছি:

  • সিস্টেমে, আপস্টার্ট ইত্যাদির জন্য / বিনে অনুসন্ধান করুন
  • সিস্টেমড, আপস্টার্ট ইত্যাদি ইত্যাদির সাথে / প্রোক / 1 / কমের তুলনা করুন
  • ব্যবহারকারীকে জিজ্ঞাসা করুন

এটি করার সর্বোত্তম ক্রস / প্ল্যাটফর্মের উপায় কী হবে?

সম্পর্কিত ধরনের, আমি কি * nix এর সংখ্যাগরিষ্ঠের উপর নির্ভর করতে বাশের উপর নির্ভর করতে পারি বা এটি বিতরণ / ওএস নির্ভর?

লক্ষ্য প্ল্যাটফর্ম:

  • ম্যাক অপারেটিং সিস্টেম
  • লিনাক্স (সমস্ত বিতরণ)
  • বিএসডি (সমস্ত সংস্করণ)
  • সোলারিস, মিনিক্স এবং অন্যান্য * নিক্স

1
শুধু আমার দুটি সেন্ট যুক্ত করতে, ব্যাশ ফ্রিবিএসডি-তে ডিফল্টরূপে ইনস্টল করা হয়নি।
চিন্ময় কাঁচি

@tjameson, আপনি কি আরও সরাসরি কোন উপায় খুঁজে পেয়েছেন? আমি একই জিনিসটি খুঁজছি তবে এখানে উত্তরগুলি কেবল দিকনির্দেশক, সরাসরি উত্তর নয়। বিশেষত 1) স্ক্রিপ্টের অবস্থানগুলি অনুসন্ধান করতে হবে এবং 2) কার্যকরভাবে init সিস্টেম সনাক্ত করতে, সেখানে একাধিক ইনস্টল থাকা অবস্থায় (ব্যাশের সরাসরি উত্তর দেওয়া হয়েছিল)।
n611x007

3
@naxa - সংক্ষিপ্ত উত্তর, না। দীর্ঘ উত্তর, আপনি প্রায় সন্ধান করতে পারেন ps -p 1 -o command(স্রোতের পথে প্রিন্ট করে init)। আর্চ লিনাক্স এবং ফেডোরায় (আইআইআরসি), এটি systemdবাইনারি (সম্ভবত সমস্ত systemdসিস্টেমে একই ) এর একটি সিমিলিংক । চালু upstart, init --helpব্যবহারের তথ্য প্রিন্ট করবে এবং আমার বাক্সে upstartকোথায় উল্লেখ করা হয়েছে যে কে ইমেল করবে। ফ্রিবিএসডি (এসআইএসভি) এ, এটি একটি ত্রুটি ফিরিয়ে দেবে। অন্যান্য সিস্টেমে একই ধরণের চিহ্ন থাকতে পারে, তবে এই প্রশ্নটি জিজ্ঞাসা করার পরে, আমি ঠিক করেছি যে এগুলি কেবল সমস্ত প্ল্যাটফর্মের জন্য তৈরি করব এবং প্রতিটিটির জন্য পৃথক প্যাকেজ তৈরি করব।
বেটগ্যামিট

ধন্যবাদ দুর্দান্ত তথ্য! আমি শিখেছি এটি থেকে আরও আশাবাদী যে sudo lsof -a -p 1 -d txtআরও সঠিক ফলাফল দিতে পারে। psএকটি স্বেচ্ছাসেবী নাম মুদ্রণ করতে পারে, lsofআপনি সত্যিকারের এক্সিকিউটেবল পাথ পাবেন। (আমার প্রশ্নটি দেখুন unix.stackexchange.com/questions/102453/… )
n611x007

1
লিঙ্কযুক্ত প্রশ্নের উত্তর বা মন্তব্যগুলির কোনওই বাশ সম্পর্কিত নয়। সমাধানগুলি আপনার ক্ষেত্রেও প্রযোজ্য উচিত।
মার্কো

উত্তর:


30

দ্বিতীয় প্রশ্নের জন্য, উত্তরটি নেই এবং আপনার পোর্টেবল শেল প্রোগ্রামিংয়ের রিসোর্সগুলির দিকে নজর দেওয়া উচিত ।

প্রথম অংশ হিসাবে - প্রথমত, আপনাকে অবশ্যই যত্নবান হতে হবে। আমি বলতে চাই নিশ্চিত করতে বিভিন্ন পরীক্ষা সঞ্চালন - কারণ এটা সত্য যে কেউ আছে নেই (। প্রাক্তন জন্য) systemd ইনস্টল মানে এই নয় এটা আসলে ডিফল্ট হিসেবে ব্যবহার করা হয় init। এছাড়াও, তাকানো /proc/1/commবিভ্রান্তিমূলক হতে পারে, কারণ বিভিন্ন /sbin/initউদ্যোগ প্রোগ্রামের কিছু ইনস্টলেশন স্বয়ংক্রিয়ভাবে তাদের মূল প্রোগ্রামটির একটি সিলেমিং হার্ডলিঙ্ক বা এমনকি একটি নামকরণ সংস্করণ তৈরি করতে পারে।

হতে পারে সর্বাধিক দরকারী জিনিসটি স্ক্রিপ্টগুলির ধরণের দিকে নজর দেওয়া হতে পারে - কারণ এগুলি হ'ল আপনি যা তৈরি করছেন তা সেগুলি চালায় না কেন।

পার্শ্ব দ্রষ্টব্য হিসাবে, আপনার ওপেনআরসি- র দিকে নজর থাকতে পারে যা লিনাক্স এবং বিএসডি উভয় সিস্টেমের সাথে সামঞ্জস্যপূর্ণ init স্ক্রিপ্টগুলির একটি কাঠামো সরবরাহ করতে পারে ।


2
"Init স্ক্রিপ্টগুলির ধরণটি দেখুন" বলতে কী বোঝ? প্রায়শই বিভিন্ন init সিস্টেমগুলি তাদের স্ক্রিপ্টগুলি / ফাইলগুলি কোথাও কোথাও /etc/initরাখে, যেমন সিস্টেমড এগুলি রাখে /etc/systemd। যদি আমার স্ক্রিপ্টটি এগুলি ছড়িয়ে দেওয়া হয় তবে এটি কিছুটা সময় নিতে পারে। ওহ, এবং পোর্টেবল শেল প্রোগ্রামিংয়ের জন্য লিঙ্ক বিটিডাব্লুটির জন্য ধন্যবাদ।
বেটগ্যামিট

1
আমি বলতে চাইছিলাম যে কিছু থিম প্রয়োগগুলি বিভিন্ন থ্রি স্ক্রিপ্টের ধরণের এবং অবস্থানগুলির (যেমন /etc/rc.d/বা /etc/init.d/) ব্যবহার করতে সামঞ্জস্য করা যায় । এবং প্রদত্ত সিস্টেমে ব্যবহৃত কাঠামোটি ব্যবহারের জন্য আপনার ইনস্টলেশন প্রোগ্রামের সময় আপনার প্রোগ্রামটি যথাযথভাবে সামঞ্জস্য করা উচিত ।
rozcietrzewiacz

2
সুতরাং, আপনি কি বলছেন যে প্রোগ্রামটিভাবে init সিস্টেম সনাক্ত করার কোনও নির্ভরযোগ্য উপায় নেই? ব্যবহারকারীকে প্যারামিটারে পাস করা অবশ্যই নিরাপদ তবে ব্যবহারকারী যদি কিছু পাস না করে তবে অনুমান করার সর্বোত্তম উপায় কী হবে?
g ই

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

শীতল, আপনার সমস্ত সহায়তার জন্য ধন্যবাদ। আপনি অবশ্যই আমাকে সঠিক দিকে নির্দেশ করেছেন।
বেটগ্যামিট

58

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

সুতরাং যারা "স্বয়ংক্রিয় সনাক্তকরণ" করতে চান তাদের জন্য আমি সীমিত সংক্ষেপে (আরও নীচে) সেটগুলি খুঁজে পেয়েছি :

  • আপনি আপস্টার্ট থেকে বলতে পারেন:

    [[ `/sbin/init --version` =~ upstart ]] && echo yes || echo no
  • আপনি সিস্টেমেড থেকে বলতে পারেন:

    [[ `systemctl` =~ -\.mount ]] && echo yes || echo no
  • আপনি এর থেকে sys-v 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

ইসি 2 উদাহরণগুলিতে (আমি ইউএস-পূর্ব এএমআই আইডি সহ)

  • আর্কলিনাক্স: সিস্টেমড ব্যবহার করছে ( ২০১২.০০.০ since থেকে )
  • CentOS6.4 ami-52009e3b: আপস্টার্ট ব্যবহার করে
  • CentOS7 ami-96a818fe: systemd ব্যবহার করে
  • ডেবিয়ান 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 ব্যবহার করে
  • উবুন্টু 10.04 ami-6b350a02: আপস্টার্ট ব্যবহার করে
  • উবুন্টু 12.04 ami-b08b6cd8: আপস্টার্ট ব্যবহার করে
  • উবুন্টু 14.04 ami-a427efcc: আপস্টার্ট ব্যবহার করে
  • উবুন্টু 14.10 এবং আরও কম: সিস্টেমড ব্যবহার করে
  • এডাব্লুএস লিনাক্স 2014.3.2 ami-7c807d14: আপস্টার্ট ব্যবহার করে
  • ফেডোরা 19 ami-f525389c: systemd ব্যবহার করে
  • ফেডোরা 20 ami-21362b48: systemd ব্যবহার করে

কেবল পরিষ্কার করে বলা: আমি দাবি করছি না যে এটি নির্বোধ! , এটি প্রায় অবশ্যই না। এছাড়াও নোট করুন যে সুবিধার জন্য আমি ব্যাশ রিজেক্সপ ম্যাচগুলি ব্যবহার করি যা সর্বত্র পাওয়া যায় না। উপরের মুহূর্তে আমার জন্য যথেষ্ট ভাল। তবে আপনি যদি কোনও ডিস্রো খুঁজে পান যেখানে এটি ব্যর্থ হয় তবে দয়া করে আমাকে জানান এবং আমি ইসি 2 এএমআই যদি সমস্যাটি পুনরুত্পাদন করে তবে এটি ঠিক করার চেষ্টা করব ...


5
সিস্টেমেড ডকুমেন্টেশন ( এসডি_ বুটেড (3) ) অনুসারে, সিস্টেমডের জন্য যাচাই করার সঠিক উপায়টি ডিরেক্টরিটি /run/systemd/systemবিদ্যমান কিনা তা পরীক্ষা করা ।
রবি বাসাক

1
আমি এই সনাক্তকরণে যুক্ত করব launchd, ম্যাকোস-এ প্রথম ব্যবস্থা: [[ $(ps 1) =~ 'launchd' ]] && echo yes || echo noএকটি ম্যাকবুকপ্রোতে পরীক্ষিত, ম্যাকোস সিয়েরা সংস্করণ 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

পিআইডি # 1 প্রক্রিয়াটির নামের দিকে মনোযোগ দেওয়ার ফলেও ইন্ডি সিস্টেমটি ব্যবহার করা হচ্ছে বলে সম্ভাব্যভাবে আলোকপাত করতে পারে। ফেডোরা ১৯-তে (যা ব্যবহার করে 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

দ্রষ্টব্য: তবে এটিকে কিছুটা সতর্কতার সাথে ব্যবহার করুন। সেখানে না পাথর মধ্যে সেট কিছু একটি নির্দিষ্ট Init সিস্টেম একটি প্রদত্ত ডিস্ট্রো ব্যবহৃত হচ্ছে বলে যে হয়েছে আছে systemdযেমন PID, # 1।

জাতিবাচক

$ (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

পিপিড 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/initসিসভিনিট সিস্টেমে থাকে।

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 সিস্টেমটি নির্ধারণের জন্য কিছু পদক্ষেপ গ্রহণ করা উচিত।
user369450

1
পিআইডি # 1 অগত্যা /usr/lib/systemd/systemdসিস্টেমেড ব্যবহার করা হয় না, এটি একটি ভুল ধারণা। আমার সিস্টেমে, উদাহরণস্বরূপ, পিআইডি # 1 হ'ল /sbin/init(আমি সিস্টেমড ব্যবহার করি)। এটি বিতরণ নির্ভর।
মার্কো

আমার কুবুন্টু 15.04 ইনস্টলেশনে আমি সিস্টেমেড এবং সিজনভিট উভয়েরই উপস্থিত রয়েছি। কেন বা এর অর্থ কী তা জানেন না, কেবল বলছেন .. pgrep systemd >/dev/null && echo init system: systemd -> init system: systemdএবংtype init -> init is /sbin/init
dotnetCarpenter

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

এটি একাধিক স্ট্রিং মিললে আরও লাইন প্রিন্ট করবে, যা "অনুমান করতে পারি না" অনুবাদ করা যেতে পারে। গ্রেপ ব্যবহৃত স্ট্রিংগুলি সামান্য পরিবর্তন করা যেতে পারে তবে নিম্নলিখিত ওএসে পরীক্ষা করার সময় আমি সর্বদা একটি লাইন পাই।

  • RHEL 6.4 [আপডেট]
  • RHEL ES 4 (নাহন্ত আপডেট 7) [SYSVINIT]
  • উবুন্টু 16.04.1 এলটিএস [সিস্টেম]
  • উবুন্টু ১৪.০৪.২ এলটিএস [উত্তর]
  • ফেডোরা 23 টি রিলিজ করেছে (অনলাইন শেল) [সিস্টেম]
  • ডেবিয়ান জিএনইউ / লিনাক্স ((অনলাইন শেল) [সিস্টেম]

একই সমাধানের আরও সরল পদ্ধতিতে (তবে এটি প্রথম ম্যাচে থামে)

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

সুন্দর প্রথম উত্তর। unix.se স্বাগতম!
অলিভিয়ার ডুলাক

আমি ওপেনআরসি ইনস্টল করা একটি জেন্টু ডিফল্ট ডকার ইমেজে এটি চেষ্টা করেছি এবং এটি এসআইএসভিএনআইটি ফিরে আসল। উইকি.সিঞ্জো.আর.জি.উইকিউ / কমপিরিয়েন্স_অফ_ইনিট_সিস্টেম অনুসারে জেন্টুর জন্য ডিফল্ট হ'ল ওপেনসি, তবে দেখা যায় যে ওপেনআরসি সিজনভিট ব্যবহার করে। তারপরে আমি যখন ওপেনসিআর কমান্ডগুলি চেষ্টা করি তখন আমি "আপনি যে সিস্টেমে ওপেনসিআর বুট করেনি সেগুলিতে ওপেনআরসি পরিষেবা চালানোর চেষ্টা করছেন" " সিসভিনেট ব্যবহার করে সিসভিনিট যথাযথ এবং ওপেনআরসি-র মধ্যে পার্থক্য করার কোনও উপায় আছে কি?
টিউডার

9

কখনও কখনও এটি ব্যবহারের মতো সহজ ls :

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

আমি অনুমান করি যে /sbin/initএটি যদি একটি প্রতীকী লিঙ্ক না হয় তবে আপনাকে অন্যান্য উত্তরে নিম্নলিখিত পরামর্শগুলি পরীক্ষা করতে হবে।


3
  1. এটি ডিস্ট্রো-নির্দিষ্ট প্যাকেজগুলির জন্য। সফটওয়্যারটি সঠিকভাবে ইনস্টল করার জন্য আরও বেশি কিছু রয়েছে কেবলমাত্র থিম সিস্টেম সনাক্তকরণের চেয়ে। অনেকগুলি ডিস্ট্রো সিসভিট ব্যবহার করে তবে তাদের সকলেই তাদের আরআইডি স্ক্রিপ্টগুলি একইভাবে লেখেন না। এটি সমাধানের যথাযথ উপায় হ'ল সমস্ত ভিন্ন রূপগুলি অন্তর্ভুক্ত করা এবং তারপরে আরপিএম ডিগ্রোসের জন্য ডিস্ট্রো-নির্দিষ্ট নির্ভরতার নাম, অ্যাপটি ভিত্তিক সিস্টেমগুলির জন্য ডেব ফাইল ইত্যাদির সাথে নির্দিষ্ট ফাইলগুলি ব্যবহার করে এটি বান্ডিল করা most প্রায় সমস্ত ডিস্ট্রোতে আপনার কোনও না কোনও প্যাকেজ নির্দিষ্টকরণ থাকে you লিখতে পারে যার মধ্যে নির্ভরতা, স্ক্রিপ্টস, আরআর স্ক্রিপ্টস ইত্যাদি অন্তর্ভুক্ত থাকে here এখানে চাকাটি পুনরায় উদ্ভাবন করবেন না।

  2. না। যা আমাদের 1 এ ফিরে আসে। আপনার যদি বাশ দরকার হয় তবে এটি নির্ভরতা হওয়া উচিত। আপনি আপনার কনফিগার স্ক্রিপ্টগুলির অংশ হিসাবে এই চেকটি নির্দিষ্ট করতে পারেন, তবে এটি প্যাকেজ বিবরণেও হওয়া উচিত।

সম্পাদনা: যেমন আপনার কনফিগার স্ক্রিপ্ট ব্যবহার করুন পতাকার --with upstartবা --without sysvinit। একটি বুদ্ধিমান ডিফল্ট চয়ন করুন, তারপরে স্ক্রিপ্টগুলি অন্য সফটওয়্যারগুলির জন্য আপনার সফ্টওয়্যারটিকে প্যাকেজ করে অন্য বিকল্পগুলির সাথে এটি চালনার জন্য চয়ন করতে পারে।


হ্যাম্ফ, সুতরাং দেখে মনে হচ্ছে আমার কাছে 'সবগুলিকে শাসন করার জন্য একটি স্ক্রিপ্ট' থাকতে পারে না সমাধান। আমি প্রচুর প্রোগ্রাম দেখেছি যা ক্রস প্ল্যাটফর্ম স্টাফগুলি পরিচালনা করতে অটোকনফ বা অনুরূপ ব্যবহার করে তবে এটি আমার অ্যাপ্লিকেশনের জন্য সঠিক সরঞ্জাম বলে মনে হয় না। প্রতিটি প্ল্যাটফর্মের জন্য সংস্করণগুলি বজায় রাখা কি একমাত্র নির্ভরযোগ্য সমাধান?
বেটগ্যামিট

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

@ টিজেমসন: আমি বুঝতে পেরেছি আমি সবচেয়ে গুরুত্বপূর্ণ কিছুটি ভুলে গেছি। এই ধরণের জিনিসটি সাধারণত কনফিগার স্ক্রিপ্টে স্যুইচগুলি দিয়ে করা হয়। প্রতিটি ডিসট্রোর বিল্ড / প্যাকেজ রুটিনে বিভিন্ন সুইচ কল করতে পারে এবং আপনার কনফিগার / মেকটি কেবল এটি কী স্যুইচটি পাস হয়েছে তা জানতে হবে, সমস্ত সম্ভাব্য সফ্টওয়্যার কনফিগারেশন সনাক্ত করতে পারে না।
কালেব

@ কালেব- হ্যাঁ, আমি ইতিমধ্যে সেখানে এই যুক্তিটি পেয়েছি তবে ভাল ধরা পড়ে। আমি বুদ্ধিমান অনুমানটি বুদ্ধিমান ডিফল্টের চেয়ে বুদ্ধিমান অনুমানটি ব্যবহার করার জন্য ইনি ডি সিস্টেমটি স্নিগ্ধ করার কোনও উপায়ের জন্য আশা করছিলাম।
বেটগ্যামিট

2

জেন্টুতে, পিড 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

আপনি জেন্টু দিয়ে সনাক্ত করতে পারেন [ -f /etc/gentoo-release ]

জেন্টুতে থাকা অন্য একটি পদ্ধতি হ'ল ব্যবহার করা profile-config show, যা দেখায় যে কোন ডিফল্ট প্রোফাইলটি ব্যবহার হচ্ছে। / সিস্টেমে শেষ হওয়া দুটি ব্যতীত অন্য সমস্ত প্রোফাইল ওপেনআরসি ইমে ব্যবহার করে। মনে রাখবেন, এগুলি কেবলমাত্র একটি ডিফল্টর প্রতিনিধি এবং এটি সম্ভব হয় যে ব্যবহারকারী সেই ডিফল্টটিকে ওভাররাইড করার পদক্ষেপ নিয়েছে এবং প্রকৃতপক্ষে ব্যবহৃত থ্রি ম্যানেজারের পরিচায়ক নাও হতে পারে।


বোবা প্রশ্ন, তবে আমি কীভাবে পিড 1 চেক করব?
ফাহিম মিঠা

ব্যবহার করুন pবিকল্প (অভিন্ন -pএবং --pidপিআইডির নির্বাচন করতে)। উপরের স্নিপেটটি আসলে আউটপুট ps u --pid 1
হোসে এম বেনিতেজ

2

ডিবিয়ান / এসবিএন / আরআইআর তে আপনার ডিফল্ট আর্টের জন্য একটি সিমিলিংক

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 এ আপস্টার্ট সহ, এটি কোনও সিমলিংক নয়।
মুরু

অন্য আর একটি সিস্টেম ইনস্টল করুন এবং আবার চেক করুন।
rmorelli74

এবং initআমি উবুন্টু 14.04 এ অন্য কোনটি ইনস্টল করতে পারি?
মুরু

... সিসভি বা সিস্টেমড কেন হয় না?
rmorelli74

1
আমি ডাউনওয়েট করতে চাই না, আমি কেবল চাই আপনি এটি নির্দিষ্ট করে দেবেন যে এটি ডেবিয়ানের কোন সংস্করণে প্রযোজ্য। (এবং সম্ভবত "দেবিয়ান-ভিত্তিক" কেবল "দেবিয়ান"
-কে পুনর্বিবেচনা করুন

2

পিআইডি 1 দিয়ে কেবল প্রক্রিয়াটিতে গ্রেপিং আপনাকে বলবে:

strings /proc/1/exe |grep -q sysvinit
strings /proc/1/exe |grep -q systemd

উল্লিখিত সমস্ত ওএসএসের একটি procফাইল সিস্টেম নেই ...
টবি স্পিড

2

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

$ 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

তখন অন্য সিস্টেমগুলি সম্পর্কে ডেবিয়ান (হুইজি) / অথবা উবুন্টু (14.10।) সম্পর্কে জানেন না তবে আমি সরল পুরানো fileকমান্ড দিয়ে এই জাতীয় সমস্যাগুলি পরীক্ষা করি ।

file /sbin/init

এটি দিন:

/sbin/init: symbolic link to 'upstart'

systemd(উদাহরণস্বরূপ সিড) সহ ডেবিয়ান সিস্টেমগুলি এটি দেখায়:

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

আপনি কোন সিস্টেমে এটি পরীক্ষা করেছেন? দেবিয়ান / উবুন্টু এর মতো কোনও জিনিস নেই এবং এটি ডিবিয়ান নিয়ে কাজ করে না। আপনি এটি উবুন্টুতে চেষ্টা করে দেখেছেন?
টেরডন

এই বিভ্রান্তির জন্য দুঃখিত, আমার অর্থ ডেবিয়ান (হুইজি) / অথবা উবুন্টু (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 মানে আমরা এখানে এসওয়াইএসভি ব্যবহার করি। আমার উত্তরে উবুন্টুর আউটপুট প্রদর্শিত হবে।
জাজারু

ঠিক যেমন, আপনার সমাধানটি কেবল তখনই কাজ করে মনে হয় যদি কেউ আপস্টার্ট এবং উবুন্টু ব্যবহার করে।
টেরডন

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

1
@psmears যদি এটি কিছু সিস্টেমযুক্ত সিস্টেমের জন্যও কাজ করে তবে তা আরও ভাল (তবে এই উত্তরে উল্লেখ করা হয়নি)। আমি সবেমাত্র একটি ডেবিয়ান চলমান সিজনভিট এবং তিনটি উবুন্টাস (10.04,12.04 এবং 14.04, সমস্ত চলমান উপস্থাপক) পরীক্ষা করে দেখেছি এবং file /sbin/initসমস্ত সিস্টেমে "এক্সিকিউটেবল" ফিরে এসেছি । এটি CentOS 5.8, এসএলইএস 10, একটি উবুন্টু 8.04 এও একই রকম ফিরে আসে, মূলত প্রতিটি একক সিস্টেমে আমি আমার হাত পেতে পারি। সুতরাং, যতদূর আমি এটি বলতে পারি এটি আপস্টার্ট এবং উবুন্টুর পক্ষেও কাজ করে না।
টেরডন

2

আমারও একই সমস্যা ছিল এবং কিছু রেডহ্যাট / সেন্টস / ডেবিয়ান / উবুন্টু / মিন্ট মেশিনে প্রচুর পরীক্ষা করেছিলাম। এটিই আমি ভাল ফলাফল সহ শেষ করেছি।

  1. পিআইডি 1 দিয়ে এক্সিকিউটেবলের নাম সন্ধান করুন:

    ps -p 1

    এটি যদি সিস্টেমড বা আপস্টার্ট হয় তবে সমস্যাটি সমাধান করা হবে। যদি এটি "init" হয় তবে এটি একটি সিমিলিংক বা একটি সামনের নাম ব্যতীত অন্য কিছু হতে পারে। এগিয়ে যান.

  2. এক্সিকিউটেবলের জন্য আসল পথটি সন্ধান করুন (কেবলমাত্র রুট হিসাবে কাজ করুন):

    ls -l `which init`

    তাহলে initভুঁইফোড় বা systemd হল করার জন্য একটি সিমবলিক লিঙ্ক হয়, সমস্যার সমাধান। অন্যথায়, এটি প্রায় নিশ্চিত যে আপনার কাছে এসআইএসভি ইন্ডি আছে। তবে এটি একটি ভুল নাম নির্বাহযোগ্য হতে পারে। এগিয়ে যান.

  3. প্যাকেজটি নির্বাহ করুন যা কার্যকর করে Find দুর্ভাগ্যক্রমে, এটি দৃষ্টিভঙ্গি নির্ভর:

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

তারপরে, আপনি যদি স্ক্রিপ্ট করতে চান (মজাদার অংশ, আইএমএইচও), এগুলি আমার ওয়ান-লাইনার (মূল হিসাবে চালানো):

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 নেই (এই সমস্যাটি কেবল আপনার উত্তর, বিটিডাব্লুয়ের সাথে সুনির্দিষ্ট নয়)।
টবি স্পিড

@ টোবি-স্পিট হ্যাঁ, অবশ্যই দ্রষ্টব্য আমি আমার উত্তরে তাই বলেছি, সীমাবদ্ধতা পরিষ্কার করার জন্য।
এমারসন প্রাদো

পদক্ষেপ 3 হিসাবে, আপনি init --versionতথ্য পেতে দৌড়াতে পারেন।
জার্নো

1

কিছু প্রাথমিক বিদ্যালয়ের জন্য এটি সত্যিই সহজ। সিস্টেমডের জন্য:

test -d /run/systemd/system

আপস্টার্ট জন্য:

initctl --version | grep -q upstart

অন্য যে কোনও কিছুর জন্য, আপনি কেবল ডিসট্রোর ভিত্তিতে ধরে নিতে পারেন (ওএস এক্স-এ প্রবর্তিত, দেবিয়ান-এ সিজনভিট, জেন্টুতে ওপেনআরসি)।


"ডিস্ট্রোর উপর ভিত্তি করে ধরে নিন" দেবিয়ানের পক্ষে কাজ করে না, যেখানে কমপক্ষে তিনটি আলাদা ইনাইটস সমর্থিত ...
টবি স্পিড

1

সনাক্তকরণের জন্য এখানে বাশ স্ক্রিপ্ট's এই মুহুর্তে এটি কেবলমাত্র আপস্টার্ট এবং সিস্টেমডের জন্য যাচাই করে তবে প্রসারিত করা সহজ হওয়া উচিত। আমি কোড থেকে এটি নিয়েছি, আমি ডিসপ্লেলিঙ্ক ড্রাইভার ইনস্টল স্ক্রিপ্টে অবদান রেখেছি

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

সিস্টেমড বনাম ডিআইডি পরীক্ষার সময় অনেকগুলি সামঞ্জস্যতা সংক্রান্ত সমস্যা রয়েছে। এটি আসলে ওপেনসুএস ৪২.১ এ কাজ করে:ps --pid 1 | grep -q systemd && echo 'systemd' || echo 'init'


1

এর জন্য systemd:

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

ডাউনভিটিং কারণ এই উত্তরটি বিদ্যমান বিদ্যমান উত্তরের তুলনায় কোনও নতুন বা ভিন্ন তথ্য সরবরাহ করে না।
jayhendren

@jayhendren আমি এই স্নিপেট অন্য কোথাও দেখতে পাচ্ছি না। এটি নিজের মধ্যে সম্পূর্ণ নয়, এবং সম্ভবত উত্তর ইউনিক্সের বিরুদ্ধে মন্তব্য হিসাবে আরও ভাল দাঁড়িয়ে থাকতে পারে। স্ট্যাককেক্সচেঞ্জ. com
a/

ওহ, আপনি ঠিকই বলেছেন এটি অন্যদের মতো ঠিক নয়। আমি পৃষ্ঠাটি খুব বেশি-নির্দিষ্ট স্ট্রিংয়ের জন্য অনুসন্ধান করেছি :)
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

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


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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.