আমি কেন পিএস এর জন্য আলাদা প্রস্থান স্থিতি পাই স্ক্রিপ্টে গ্রেপ?


11

আমি স্ক্রিপ্টের নীচে চলছে:

#!/bin/bash

ps ax  | grep -q [v]arnish
if [ $? -eq 0 ];then
        echo varnish is running...
        exit 0
else
        echo "Critical : varnish is not running "
        exit 2
fi

আউটপুট যেমন হয় ::

[root@server ~]# sh -x check_varnish_pro.sh
+ ps ax
+ grep -q '[v]arnish'
+ '[' 0 -eq 0 ']'
+ echo varnish is running...
varnish is running...
+ exit 0

কমান্ড লাইনে যখন আমি একই চালাই তখন আমি প্রস্থান স্থিতি 1 হিসাবে পাই:

[root@server ~]# ps ax  | grep -q [v]arnish; echo $?
1

কেসটি সার্ভারে বার্নিশ ইনস্টল না করার মতো। এই স্ক্রিপ্টটি এমন সার্ভারে ভাল কাজ করে যেখানে বার্নিশ ইনস্টল করা আছে।

স্ক্রিপ্ট এবং কমান্ড লাইন ব্যবহার করে চালানোর সময় কেন বিভিন্ন প্রস্থান স্থিতি? কিভাবে এই স্ক্রিপ্ট উন্নতি?


এই ধরণের হ্যাকারি নয়, একটি আসল প্রক্রিয়া তদারকি সিস্টেম ব্যবহার করুন। আপনার অপারেটিং সিস্টেমে নিশ্চিতভাবেই একটি অন্তর্নির্মিত উপায় থাকবে যাতে আপনি অবধি থাকতে চান আপনার ডেমোনগুলি ব্যর্থতার পরে স্বয়ংক্রিয়ভাবে পুনরায় চালু হয়, এটি আপস্টার্ট, ডিমনটোলস, সিস্টেমেড, লঞ্চ করা, বা অনেকগুলি বিকল্পের মধ্যে একটি হতে পারে। এঁরা সকলেই এই ধরণের হাত-ঘূর্ণিত হ্যাকারির চেয়ে আরও দৃ rob় এবং সক্ষম হবেন।
চার্লস ডাফি

উত্তর:


10

আপনি যখন check_varnish_pro.shপরীক্ষা নামে একটি স্ক্রিপ্ট চালান

ps ax  | grep -q [v]arnish

সফল কারণ check_বার্নিশ নামে একটি স্ক্রিপ্ট _proচলছে।


14

সাধারণভাবে, সহজ পদ্ধতির সাথে চেষ্টা করা psএবং grepপ্রদত্ত প্রক্রিয়াটি চলছে কিনা তা নির্ধারণ করার চেষ্টা করা খারাপ ধারণা ।

আপনি এটির pgrepজন্য ব্যবহার করা আরও ভাল হবে :

if pgrep "varnish" >/dev/null; then
  echo "Varnish in running"
else
  echo "Varnish is not running"
fi

জন্য ম্যানুয়াল দেখুন pgrep। কিছু সিস্টেমে (সম্ভবত লিনাক্সে নেই), আপনি একটি -qপতাকা পাবেন যা একই পতাকার সাথে মিলে যায় grepযার জন্য পুনঃনির্দেশের প্রয়োজন থেকে মুক্তি পেয়ে যায় /dev/null। একটি -fপতাকা রয়েছে যা কেবলমাত্র প্রক্রিয়া নামের পরিবর্তে সম্পূর্ণ কমান্ড লাইনে ম্যাচটি সম্পাদন করে। তোলা যায় ব্যবহার করে একটি নির্দিষ্ট ব্যবহারকারীর একাত্মতার প্রক্রিয়াগুলিতে ম্যাচ সীমিত হতে পারে -u

ইনস্টল করা pgrepআপনাকে এতে অ্যাক্সেসও দেয় pkillযা আপনাকে তাদের নামের উপর ভিত্তি করে প্রক্রিয়াগুলি সিগন্যাল করার অনুমতি দেয়।

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

লিনাক্সে, আপনার ওপেনবিএসডি-তে আছে systemctl( systemctl is-active --quiet varnishএটি চলমান থাকলে 0 ফিরে আসবে) rcctl, ইত্যাদি etc.


এখন আপনার স্ক্রিপ্টে:

আপনার স্ক্রিপ্টে, আপনি আউটপুট পার্স করে ps ax। এই আউটপুটটিতে নিজেই স্ক্রিপ্টের নাম থাকবে, এতে check_varnish_pro.shঅবশ্যই স্ট্রিং রয়েছে varnish। এটি আপনাকে একটি মিথ্যা ইতিবাচক দেয়। আপনি যদি পরীক্ষার সময় -qপতাকা ছাড়াই এটি চালিত করে থাকেন তবে আপনি এটি স্পষ্ট করতে পারতেন grep

#!/bin/bash
ps ax | grep '[v]arnish'

এটি চালানো:

$ ./check_varnish_pro.sh
31004 p1  SN+     0:00.04 /bin/bash ./check_varnish_pro.sh

আরেকটি সমস্যা হ'ল যদিও আপনি প্যাটার্নটি ব্যবহার করে grepপ্রক্রিয়াটি grepনিজের দ্বারা সনাক্ত করা থেকে "আড়াল" করার চেষ্টা করছেন [v]। যদি আপনি কোনও ডিরেক্টরিতে স্ক্রিপ্ট বা কমান্ড লাইনটি চালিত করতে চান তবে এর মধ্যে একটি ফাইল বা ডিরেক্টরি রয়েছে varnish(যে ক্ষেত্রে আপনি আবার একটি মিথ্যা ধনাত্মক পাবেন) fail এটি হ'ল কারণ প্যাটার্নটি অনুপযুক্ত এবং শেল এটির সাথে ফাইলের নাম গ্লোববিং করবে।

দেখা:

bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2  SN+p    0:00.02 grep varnish

ফাইলের উপস্থিতি varnishশেলটি [v]arnishফাইলের সাথে প্রতিস্থাপন করবে varnishএবং আপনি প্রক্রিয়া সারণীতে ( grepপ্রক্রিয়া) প্যাটার্নটিতে হিট পাবেন ।


4
কারণ সবকিছুই "লিনাক্স জমিতে" ফাইল।
জি

@ z_- এটি কীভাবে সংযুক্ত রয়েছে তা পুরোপুরি নিশ্চিত নয়, তবে এটি লিনাক্স নন-ইউনিটগুলিতেও সত্য।
কুসালানন্দ

4
শুধু গ্রেপ প্রক্রিয়া নয়; স্ক্রিপ্টের নামকরণও check_varnish_pro.shএকটি ফ্যাক্টর।
TNW

@ টিএনডাব্লু আমি প্রথমে এটি স্পষ্ট করি নি তবে আপনি ঠিক বলেছেন। আমি যে যুক্ত করতে হবে।
Kusalananda

3

@ অ্যালেক্সপি খুব সংক্ষিপ্তভাবে আসলে যা ঘটছে তা ব্যাখ্যা করেছে , তবে @ কুসালানন্দের একটি সমালোচনামূলক প্রক্রিয়া ব্যবহার করার pgrep/ ব্যবহার করারpkill ধারণাটি দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছেআরও ভাল সমাধান অন্তর্ভুক্ত:

  • পরিষেবাটি চলছে কিনা তা জিজ্ঞাসা করা হচ্ছে । systemctl status varnishdএটি একটি আধুনিক * নিক্স ইনস্টলেশনতে যত্ন নেওয়া উচিত।
  • কিছু দুর্ভাগ্যজনক পরিস্থিতিতে যদি আপনার কোনও পরিষেবা উপলব্ধ না থাকে তবে প্রক্রিয়াটি বেরিয়ে আসার সাথে সাথেই আপনি সমস্যার সূচনা স্ক্রিপ্টটি পরিবর্তন করতে পারবেন:

    varnish || true
    some_command_to_send_an_alert_that_the_service_has_died
  • বিকল্পভাবে পিআইডি রেকর্ড করতে পরিষেবাটি শুরু করে এমন স্ক্রিপ্টটি পরিবর্তন করুন এবং তারপরে পর্যায়ক্রমে রাষ্ট্রটি পরীক্ষা করুন kill -0 "$pid"

আমি সম্মত, আমি কেবল সমস্যার শেল স্ক্রিপ্টিং দিকগুলিই সম্বোধন করছিলাম। নোট করুন যে systemctlপ্রায় লিনাক্সে যদিও (এএফএআইকি) উপলব্ধ এবং আধুনিক ইউনিক্স-মতো সমস্ত সিস্টেমে নয়।
কুসালানন্দ

মূল প্রশ্নটিতে ট্যাগ ছিল "লিনাক্স"; আমি নিশ্চিত নই যে এটি কেন @ মুুরুর দ্বারা সরানো হয়েছিল।
l0b0

ধন্যবাদ l0b0। আমার দুটি প্রশ্ন ছিল "কেন" এবং "কীভাবে উন্নতি করবেন"। @ অ্যালেক্সের উত্তরটি আমার প্রথম প্রশ্নের সমাধান করেছে এবং আপনার উত্তর দ্বিতীয় প্রশ্নের জন্য আরও ভাল সমাধান। তবে কুসালানন্দ এ সম্পর্কিত বিষয়গুলি ব্যাখ্যা করেছেন যা আমি মনে করি যাঁদের অনুরূপ সমস্যা রয়েছে তাদের পক্ষে সহায়ক হবে। সুতরাং আমি এখন বিভ্রান্ত যা উত্তর হিসাবে গ্রহণ করতে।
Prado

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