কোনও পরিষেবা কোনও স্ক্রিপ্টে চলছে কিনা তা পরীক্ষা করার "যথাযথ" উপায়


96

আমার সমস্যা:

আমি একটি বাশ স্ক্রিপ্ট লিখছি এবং এতে আমি প্রদত্ত পরিষেবাটি চলছে কিনা তা পরীক্ষা করে দেখতে চাই।

আমি নিজেই এটি কিভাবে করতে জানি $ service [service_name] status

তবে (বিশেষত সিস্টেমেডে স্থানান্তরিত হওয়ার পরে) যা পুরো পুরো গুচ্ছটি প্রিন্ট করে যা পার্স করতে কিছুটা অগোছালো। আমি ধরে নিয়েছি যে সরল আউটপুট বা আমি যাচাই করতে পারি তার একটি রিটার্ন মান সহ স্ক্রিপ্টগুলির জন্য তৈরি একটি কমান্ড রয়েছে।

তবে প্রায় গুগলিংয়ের ফলে কেবলমাত্র এক টন "ওহ, ঠিক ps aux | grep -v grep | grep [service_name]" ফলাফল পাওয়া যায়। এটি সেরা অনুশীলন হতে পারে না, তাই না? যদি সেই কমান্ডের অন্য একটি উদাহরণ চলমান থাকে তবে এসআইএসআইআইআই স্ক্রিপ্ট দ্বারা শুরু করা হয় না?

অথবা আমি কি একটু চুপ করে একটু হাত বাড়িয়ে দেব?

উত্তর:


139

systemctlএর জন্য একটি is-activeসাবকম্যান্ড রয়েছে :

systemctl is-active --quiet service

যদি serviceসক্রিয় থাকে তবে শূন্যের সাথে স্থিতি ছাড়বে , অন্যথায় শূন্য নয়, এটি স্ক্রিপ্টগুলির জন্য আদর্শ করে তুলেছে:

systemctl is-active --quiet service && echo Service is running

যদি আপনি বাদ --quietদেন তবে বর্তমান স্থিতিটিকে এর স্ট্যান্ডার্ড আউটপুটে আউটপুটও দেয়।

Don_crissti দ্বারা নির্দেশিত হিসাবে , কিছু ইউনিট পরিষেবা সরবরাহ করতে চালিত না হওয়া সত্ত্বেও সক্রিয় হতে পারে: "RemainAfterExit" হিসাবে চিহ্নিত ইউনিটগুলি সফলভাবে প্রস্থান করলে তারা সক্রিয় বিবেচিত হবে, ধারণাটি এই যে তারা একটি পরিষেবা প্রদান করে যা ডেমনের প্রয়োজন হয় না being ( যেমন তারা সিস্টেমের কিছু দিক কনফিগার করে)। ডেমন জড়িত ইউনিটগুলি কেবল তখনই সক্রিয় থাকবে যদি ডেমনটি এখনও চলমান থাকে।


অনেশট পরিষেবাদি সম্পর্কে যত্নবান। তারা শুধুমাত্র হয় inactiveবা activatingউভয় systemctl statusএবং systemctl is-active(হিসাবে প্রস্থান 3. সঙ্গে systemd হল-241 কার্যসংক্রান্ত):systemctl show service | grep -qx ActiveStatus=activating
অ্যালোয়িজ্ Mahdal

@ অলয়েস আমি ভাবছি যে আপনি কোন জাতীয় পরিস্থিতিটির মুখোমুখি হয়েছিলেন যেখানে আপনি অনেসোট পরিষেবাটি সক্রিয় হিসাবে বিবেচনা করতে চান; তোমার কি উদাহরণ আছে?
স্টিফেন কিট

অবশ্যই, @ স্টেফেনকিট সরঞ্জামটি fooপুনরায় বুট করার সাথে জড়িত সিস্টেমে কিছু করে এবং এক-শট পরিষেবা ব্যবহার করে বলে, foo_cleanupপরবর্তী জিনিসগুলি পরিষ্কার করার জন্য বলুন at আমি এই (আমার স্ক্রিপ্ট একটি পরিসেবা হিসাবে নির্ধারিত হয়) এবং পরে ত্রুটি সংগ্রহ করতে চান পরীক্ষার করছি, কিন্তু যখন হয় পরে (Vsauce সঙ্গীত)? ভাল মানদণ্ডগুলির একটি হ'ল foo_cleanupএটি শেষ ("সক্রিয় হওয়া বন্ধ করে দেওয়া হয়েছে")।
অলয়েস মাহডাল

এটি উল্লেখ করার মতো হতে পারে যে 'ব্যর্থ হয়েছে' এছাড়াও একটি বিকল্প এবং এটি যদি কার্যকর না হয় তবে পরিষেবাটি ভিত্তিক কোনও ক্রিয়া সঞ্চালনের প্রয়োজন হয়।
ফিলি হিলি

33

systemctlস্ক্রিপ্টিং জন্য উপযুক্ত একটি মোড আছে; এর showপরিবর্তে ব্যবহার statusকরুন এবং -p/ --propertiesএবং --valueবিকল্পগুলি যুক্ত করুন কেবলমাত্র আপনার আউটপুটটি পেতে।

এখানে একটি উদাহরণ (একটি উবুন্টু 17.04 সিস্টেম থেকে):

$ systemctl show -p SubState --value NetworkManager
running

দৌড় (বা অন্যথায়) ক SubState। আপনি যদি কোনও পরিষেবা সক্রিয় কিনা তা জানতে চান, সম্পত্তিটি ব্যবহার করুনActiveState

$ systemctl show -p ActiveState --value x11-common
inactive
$ systemctl show -p SubState --value x11-common
dead

এর থেকে নোটসমূহ man:

show [PATTERN...|JOB...]
           Show properties of one or more units, jobs, or the manager
           itself. If no argument is specified, properties of the
           manager will be shown. If a unit name is specified, properties
           of the unit are shown, and if a job ID is specified,
           properties of the job are shown. By default, empty properties
           are suppressed. Use --all to show those too. To select specific
           properties to show, use --property=. This command is intended
           to be used whenever computer-parsable output is required. Use
           status if you are looking for formatted human-readable output.

-p, --property=
           When showing unit/job/manager properties with the show command,
           limit display to properties specified in the argument. The
           argument should be a comma-separated list of property names,
           such as "MainPID". Unless specified, all known properties are
           shown. If specified more than once, all properties with the
           specified names are shown. Shell completion is implemented for
           property names.

--value
           When printing properties with show, only print the value, and
           skip the property name and "=".

2
পরিশীলিত উত্তরের জন্য +1। দয়া করে ডিস্ট্রোগুলি নির্দিষ্ট করুন যা --versionসিস্টেমেস্টিটল সহ বিকল্প গ্রহণ করবে ।
এস কে ভেঙ্কট

11

জান্নার উত্তরের পরিপূরক হিসাবে, --valueবিকল্পটি সিস্টেমডের 230 সংস্করণsystemctl show সহ চালু করা হয়েছে । সুতরাং এটি ডিবিয়ান জেসির মতো নির্দিষ্ট ডিস্ট্রোজে উপলভ্য নয়।

এই ক্ষেত্রে, কেউ সেড ব্যবহার করে বিকল্পটি অনুকরণ করতে পারে:

$ systemctl show -p ActiveState sshd | sed 's/ActiveState=//g'
active
$ systemctl show -p SubState sshd | sed 's/SubState=//g'  
running

1
- মূল্য মান অন্তর্ভুক্ত সংস্করণ & distro যা কাজ করবে না নির্দেশিত জন্য +1।
এস কে ভেঙ্কট

3

কমান্ড লাইন কার্যকর করার জন্য বা আপনি যদি স্ক্রিপ্ট তৈরি করে থাকেন তবে আমি এটি দরকারী মনে করি।

@ স্টেফেনকিট থেকে অনুলিপি করা হয়েছে

এটি পরিষেবাটি বন্ধ রয়েছে কিনা তা পরীক্ষা করবে এবং পরিষেবা পুনরায় চালু করবে

systemctl is-active --quiet <service name> || <service name> restart

||সেখানে পরীক্ষা করে যদি systemctl থেকে ফেরত মান নন-জিরো অর্থ যদি এটা সক্রিয় হিসাবে লেখক দ্বারা ব্যাখ্যা করা হয়।


আপনি যদি পুনরায় চালু করার প্রয়োজন হয় তা পরীক্ষা করতে `is-ব্যর্থ .ও ব্যবহার করতে পারেন। ব্যর্থ পরিষেবাটি পুনরায় চালু করার জন্য এটি কিছুটা স্বজ্ঞাত বলে মনে হচ্ছে।
ফিলি হিলি

হ্যাঁ, তবে আমার জন্য .. আমি নিজেকে অনুশীলন করতে চেয়েছিলাম এবং ধরে নেই যে এটি যখন নেই তখন সমস্ত চলছে। যাতে আমি এটিতে অন্যান্য জিনিস যাচাই করে জিনিসগুলিতে যেতে পারি। কেবল যদি আপনি এটি চালাচ্ছেন কিনা তা খতিয়ে দেখতে চান, তবে 'ব্যর্থ' একটি যথাযথ পছন্দ। :)
তারাটি

3


আমি পার্টি করতে খুব দেরি করে ফেলেছি, কিন্তু systemctl ব্যবহার করে বরাবর হয়-সক্রিয় &&এবং ||স্ক্রিপ্টের মধ্যে এই অভ্যস্ত ক্ষেত্রে সব সময় হতে। টমকাটের জন্য নীচে একটিটি আমি ব্যবহার করেছি তবে আপনি যদি একাধিক পরিষেবাদি পরীক্ষা করতে হয় তবে এটির সুযোগটি এখানে নেই তবে আর্গুমেন্ট গ্রহণের ক্ষেত্রে এটি পরিষেবা পদ্ধতিতে ব্যবহার করতে পারেন।

STATUS=`systemctl is-active tomcat.service`
  if [[ ${STATUS} == 'active' ]]; then
    echo "Execute your tasks ....."
  else 
    echo " Service not running.... so exiting "  
    exit 1  
  fi

আমি এভাবেই ব্যবহার করেছি .... শুধু আমার ভাগ করে নিচ্ছি।

এবং সরলতা এবং সহজ স্টাফ জন্য, এখানে ব্যাখ্যা অন্যদের অনুসরণ করুন:

systemctl -q is-active tomcat.service  && echo "Tomcat Runnung" || echo "Service is not running at all "

কীভাবে সহজ চেয়ে ভাল if systemctl is-active --quiet tomcat.service? এছাড়াও, [[স্ট্যান্ডার্ড শেল নয়।
টবি স্পিড

@ টবিস্পাইটটি আমার পোস্টে যেমন উল্লেখ করা হয়েছে আপনাকে আমার পোস্টটি আরও কিছুটা পড়তে হবে "আমি এভাবেই ব্যবহার করেছি .... শুধু আমার ভাগ করে নিচ্ছি।" আমি কখনও বলিনি, এটি একটি আদর্শ শেল ব্যবহার, আপনি যদি এটি একক বন্ধনী করেন তবে এটি হয়ে যাবে তবে এখানে সুযোগের বাইরে চলে। তদতিরিক্ত আমি নীচে এটি ব্যবহার করে &&এবং করতে সহজ একক লাইন ব্যবহারের উল্লেখ করি ||
সাগর নাইয়ার

2

অক্সমেলের উত্তরের মতো সেড কমান্ডটি ব্যবহার না cut -d'=' -f 2করে অনুসন্ধান করা সমস্ত ধরণের বৈশিষ্ট্যের জন্য এটি যথেষ্ট :

উদাহরণ স্বরূপ:

$ systemctl show -p ActiveState sshd | cut -d'=' -f2
active
$ systemctl show -p SubState sshd | cut -d'=' -f2
running

এটি দুর্দান্ত তবে সেই আদেশগুলি কী করে সে সম্পর্কে আপনাকে অবশ্যই কিছু ব্যাখ্যা দেওয়া দরকার।
ফিল হিলি

-1

এই দুর্দান্ত ছোট স্ক্রিপ্টটি সবেমাত্র পেয়েছেন:

#!/bin/bash
service=replace_me_with_a_valid_service

if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
  echo "$service is running!!!"
else
  /etc/init.d/$service start
fi

উৎস


সমস্ত পরিষেবাগুলির একই নাম কার্যকর করার যোগ্য নয় এবং কোনও ব্যবহারকারীর এমন কমান্ড চালানো হতে পারে যা ঘটনাক্রমে মেলে - এটি বিপর্যয়ের একটি রেসিপি।
টবি স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.