Systemctl এবং পরিষেবা আদেশের মধ্যে পার্থক্য


143

systemdআমাদের systemctlকমান্ড স্যুট দেয় যা বেশিরভাগ বুট সময়ে পরিষেবাগুলি সক্ষম করতে ব্যবহৃত হয়। আমরা এর সাহায্যে পরিষেবাগুলির স্থিতি, থামানো, পুনরায় লোড, পুনঃসূচনা এবং পরীক্ষা করতে পারি systemctl

উদাহরণস্বরূপ, আমরা এটি করতে পারি sudo systemctl enable service_nameএবং service_nameবুট করার সময় স্বয়ংক্রিয়ভাবে শুরু হবে। বুট সময় শুরু না করার জন্য আমরা পরিষেবাগুলি অক্ষম করতে পারি।

চালানো সময়ে পরিষেবাগুলি শুরু করতে সক্ষম হতে ব্যবহৃত আদেশ serviceএবং systemctlআদেশগুলির মধ্যে কেবলমাত্র পার্থক্য systemctl? আমরা systemctlকোনও পরিষেবা ব্যবহার করতে পারি ? এর মধ্যে আর কী উল্লেখযোগ্য পার্থক্য রয়েছে?


আমার মনে হয় আপনি নিজেই ভুল উত্তরটি বেছে নিয়েছেন।
ইভান ক্যারল

উত্তর:


144

serviceকমান্ড একটি লেফাফা স্ক্রিপ্ট সিস্টেম প্রশাসক, শুরু থামাও, এবং প্রকৃত Init সিস্টেম ব্যবহৃত হচ্ছে নিয়ে বেশি দুশ্চিন্তা ছাড়া পরিষেবার স্থিতি পরীক্ষা করার অনুমতি দেয়। সিস্টেমডের পরিচিতির আগে এটি /etc/init.dস্ক্রিপ্টস এবং আপস্টার্টের initctlকমান্ডের জন্য একটি মোড়ক ছিল এবং এখন এটি এই দুটি এবং এটির জন্য একটি মোড়ক systemctlহিসাবে ব্যবহৃত হয়।

সূত্রটি ব্যবহার করুন, লূক!

এটি আপস্টার্টের জন্য যাচাই করে:

# Operate against system upstart, not session
unset UPSTART_SESSION
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version 2>/dev/null | grep -q upstart \
   && initctl status ${SERVICE} 2>/dev/null 1>/dev/null
then
   # Upstart configuration exists for this job and we're running on upstart

যদি এটি কাজ না করে তবে এটি সিস্টেমযুক্ত খুঁজবে:

if [ -d /run/systemd/system ]; then
   is_systemd=1
fi

...

# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then

এবং যদি এটির পাশাপাশি ব্যর্থ হয় তবে এটি সিস্টেম ভি /etc/init.dস্ক্রিপ্টগুলিতে ফিরে যায় :

run_via_sysvinit() {
   # Otherwise, use the traditional sysvinit
   if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
      exec env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
   else
      echo "${SERVICE}: unrecognized service" >&2
      exit 1
   fi
}

...
run_via_sysvinit

যেহেতু serviceকমান্ডটি মোটামুটি সরল মোড়কযুক্ত, এটি কেবল আসল init সিস্টেমের সরবরাহের তুলনায় কর্মের একটি সীমিত উপসেটকে সমর্থন করে।

উবুন্টুর বিভিন্ন সংস্করণে বহনযোগ্যতার জন্য, ব্যবহারকারীরা serviceকোনও পরিষেবার স্থিতি শুরু করতে, থামাতে, পুনরায় চালু করতে বা পরীক্ষা করার জন্য নির্ভরযোগ্যভাবে কমান্ডটি ব্যবহার করতে পারেন । আরো জটিল কাজগুলো জন্য, কিন্তু, প্রকৃত কমান্ড ব্যবহার করা হচ্ছে, যে হতে initctlবা systemctlবা /etc/init.dস্ক্রিপ্ট সরাসরি ব্যবহার করা থাকতে পারে।

তদ্ব্যতীত, মোড়ক হওয়ার কারণে, serviceকিছু ক্ষেত্রে স্ক্রিপ্ট সরাসরি সমতুল্য কমান্ডের চেয়েও বেশি কিছু করে। উদাহরণ স্বরূপ:

  • এটি সর্বদা /etc/init.dএকটি পরিষ্কার পরিবেশে স্ক্রিপ্টগুলি কার্যকর করে । ( উপরের ফাংশনে লং env কমান্ডের অনুরোধটি নোট করুন run_via_sysvinit))
  • এটি restartআপস্টার্ট সিস্টেমগুলিতে stop/ এর সংমিশ্রণে ম্যাপ করে start, যেহেতু initctl restartপরিষেবাটি ইতিমধ্যে চালু না থাকলে কোনও সমতল ত্রুটি ঘটবে।
  • এটি সম্পর্কিত সকেটযুক্ত সিস্টেমড পরিষেবাগুলি বন্ধ করার সময় এটি সকেটগুলি থামায়:

    case "${ACTION}" in
      restart|status)
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      start|stop)
         # Follow the principle of least surprise for SysV people:
         # When running "service foo stop" and foo happens to be a service that
         # has one or more .socket files, we also stop the .socket units.
         # Users who need more control will use systemctl directly.

আপসার্ট সার্ভিসগুলি সার্ভিস কনফিগারেশন ফাইলটিতে সরাসরি সক্ষম করা হয়েছিল (বা ওভাররাইডের মাধ্যমে অক্ষম), এবং সিস্টেম ভি স্ক্রিপ্টগুলি update-rc.dকমান্ডের সাহায্যে সক্রিয় বা নিষ্ক্রিয় করা হয়েছিল (যা /etc/rc*ডিরেক্টরিগুলিতে সিমলিংক পরিচালনা করে ) তাই serviceকমান্ডটি কখনই বুটে সার্ভিস সক্ষম বা অক্ষম করার সাথে জড়িত ছিল না never ।


34
  • systemd পিছনের দিকে SysV এর সাথে সামঞ্জস্যপূর্ণ।
  • প্রারম্ভকালে সমান্তরালভাবে পরিষেবাগুলি লোড করে
  • এটি কোনও পরিষেবার অন-ডিমান্ড সক্রিয়করণ সরবরাহ করে
  • এটি নির্ভরতা ভিত্তিক
  • এবং আরও অনেক কিছু আমি অনুমান করি ...

আপনি যেটি উল্লেখ করেছেন তার থেকেও অনেক বেশি systemctlরয়েছে।

systemd ইউনিটগুলির সাথে কাজ করে, বিভিন্ন ধরণের ইউনিট রয়েছে: লক্ষ্য, পরিষেবা, সকেট ইত্যাদির লক্ষ্যগুলি রানলেভেলের মতো একই ধারণা, তারা একসাথে ইউনিটগুলির একটি গোছা।

আপনি systemctlডিফল্ট সিস্টেম টার্গেট সেট করতে বা পেতে ব্যবহার করতে পারেন ।

systemctl get-default

আপনি অন্যান্য লক্ষ্যগুলিতে যেতে পারেন:

systemctl isolate multiuser.target

অন্যান্য লক্ষ্যগুলি হ'ল: মাল্টিউজার, গ্রাফিক্যাল, রিকউ, জরুরী, রিবুট, পাওয়ার অফ off

যেমনটি আপনি বলেছেন, আপনি systemctlপরিষেবাগুলি পরিচালনা করতে ব্যবহার করতে পারেন , পরিষেবা পরিচালনার সাথে সম্পর্কিত অন্যান্য কমান্ডগুলির মধ্যে কয়েকটি সম্পর্কে আমি অবগত রয়েছি:

# Restarts a service only if it is running.
systemctl try-restart name.service

# Reloads configuration if it's possible.
systemctl reload name.service

# try to reload but if it's not possible restarts the service
systemctl reload-or-restart name.service

কোনও পরিষেবার স্থিতি সম্পর্কে জানতে আপনি এটি ব্যবহার করতে পারেন:

systemctl status name.service

systemctl is-active name.service # running
systemctl is-enabled name.service # will be activated when booting
systemctl is-failed name.service # failed to load

আপনি কোনও পরিষেবাটি মাস্ক বা আনমাস্ক করতে পারেন:

systemctl mask name.service
systemctl unmask name.service

আপনি কোনও পরিষেবাকে মাস্ক করেছেন তবে এটির সাথে লিঙ্ক করা হবে /dev/null, সুতরাং ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে অন্যান্য পরিষেবাগুলি এটিকে সক্রিয় / সক্ষম করতে পারবে না। (আপনার প্রথমে এটি খালি করা উচিত)।

Systemctl এর অন্য ব্যবহার হ'ল ইউনিটগুলি তালিকাভুক্ত করা:

systemctl list-units

যা লোড এবং সক্রিয় সমস্ত ধরণের ইউনিটগুলির তালিকা করে।

তালিকা পরিষেবা ইউনিট:

systemctl list-units --type=service

অথবা কেবলমাত্র লোড হওয়া এবং সক্রিয় হওয়া নয় এমন সমস্ত উপলভ্য ইউনিটগুলির তালিকা করতে:

systemctl list-unit-files

আপনি উপকরণ তৈরি করতে পারেন বা এমনকি দূরবর্তী মেশিনগুলিও নিয়ন্ত্রণ করতে পারেন

systemctl --host ravexina@192.168.56.4 list-units

অন্যদিকে serviceএটি যা করতে হবে তা করে, পরিষেবাগুলি পরিচালনা করে এবং অন্য ব্যক্তির ব্যবসায়ের সাথে কিছুই করার থাকে না;)


1
এটি একটি নিখুঁত উত্তর ছিল, এমন কিছু আছে যা serviceকরতে পারে তবে পারে না systemctl?
luv.preet

আমি এটি সম্পর্কে সচেতন এমন কিছুই নয়, আমি মনে করি সার্ভিস ম্যান পৃষ্ঠাতে নজর রাখা সহায়ক হবে।
রাভেক্সিনা

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

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

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