বাশ স্ক্রিপ্ট ত্রুটি: পূর্ণসংখ্যার এক্সপ্রেশন প্রত্যাশিত


13

আমি বরং একটি অদ্ভুত সমস্যা নিয়ে আসছি, আমি একাধিক সার্ভারে একটি স্ক্রিপ্ট (বাশ) চালাচ্ছি এবং এটি সার্ভারগুলির মধ্যে একটিতে কাজ করা বন্ধ করে দিয়েছে (অন্য সমস্ত সার্ভারের সাথে পুরোপুরি সূক্ষ্মভাবে কাজ করে)।

এখানে স্ক্রিপ্টের সমস্যা অংশটি রয়েছে: (আমি নিজে এটি লিখিনি, সমস্ত ক্রেডিটগুলি "ধনী" তে যায়) ( http://www.notrainers.org/monmitted-memory-usage-on-linux-with-nagios- এবং-এনআরপি / )

    if [ "$result" -lt "$warn_level" ]; then     #Line 56
    echo "Memory OK. $result% used."
    exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then  #Line 59
    echo "Memory WARNING. $result% used."
    exit 1;
elif [ "$result" -gt "$critical_level" ]; then   #Line 62
    echo "Memory CRITICAL. $result% used."
    exit 2;
fi

সম্পূর্ণ ত্রুটি বার্তা:

./check_memory.sh: Line 56: [: 7.: integer expression expected

./check_memory.sh: Line 59: [: 7.: integer expression expected

./check_memory.sh: Line 62: [: 7.: integer expression expected

আপনার যদি আরও তথ্যের প্রয়োজন হয় তবে আমাকে জানান এবং আমি যত দ্রুত সম্ভব এটি সরবরাহ করার চেষ্টা করব।

সমস্ত ইনপুট প্রশংসা :)

উত্তর:


5

আপনার সরবরাহিত লিঙ্কটি থেকে আমি নীচের লাইনটি দেখছি।

result=$(echo "$used / $total * 100" |bc -l|cut -c -2)

@ গ্রেমের মন্তব্য অনুসারে উপরের লাইনটি নীচে পরিবর্তন করুন।

result=$(echo "$used / $total * 100" |bc -l)

এখন, উপরের লাইনটি যুক্ত করার পরে, আমাদের resultনীচের হিসাবে পূর্ণসংখ্যার আউটপুট পরিবর্তন করতে হবে ।

result1=${result/.*}

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

result1=${result/.*}

আর বদলে resultপরিবর্তন পরিবর্তনশীল নামের result1ভিতরে ifলুপ, এবং ত্রুটি সৃষ্টি হবে না।

আমি সন্দেহ করি, cut -c -2ত্রুটিটির বৈশিষ্ট্যগুলি বেশিরভাগ থেকে যেহেতু এটি কেবল প্রথম 2 টি অক্ষর কাটছে। ফলাফলের যদি কেবল একটি চরিত্র থাকে তবে কী হবে? মনে করুন যদি ফলাফলটি হয় 1.23456তবে উপরের কাটাটি 1.এমন মান হিসাবে দেখা দেবে resultযার জন্য সম্ভবত integer expectedত্রুটির কারণ রয়েছে ।

অবশিষ্ট সার্ভারগুলিতে এটি সূক্ষ্মভাবে কাজ করার কারণ হ'ল resultভেরিয়েবলটির কেবলমাত্র একটি একক সংখ্যা রয়েছে এমন কোনও ক্ষেত্রে এটির মুখোমুখি হয়নি । ফলাফলটি যদি একক অঙ্কের পরিবর্তনশীল হয় তবে উপরের সার্ভারগুলিতেও এটি ব্যর্থ হওয়ার সম্ভাবনা রয়েছে (উপরের উদাহরণে আমি উল্লেখ করেছি এমন কিছু)।


${result%%.*}এখানে দশমিক পয়েন্ট সরানোর সঠিক সম্প্রসারণ হবে। তবে মনে রাখবেন যে cut -c -2100 বা তার বেশি সংখ্যক সমস্যাগুলির কারণেও ইশারা সমস্যা সৃষ্টি করবে তাই এটি এটিকে পুরোপুরি বাদ দেওয়া নিরাপদ।
গ্রামীণ

@ গ্রামীম, আমি এটি মিস করেছি। আমার সেই লাইনে পরিবর্তন করা উচিত ছিল :)
রমেশ

6

জিনিসগুলির চেহারা অনুসারে, আপনার resultভেরিয়েবলের .মধ্যে এটির সংখ্যা রয়েছে যার পরে সংখ্যাটি তৈরি করা বাশ এটিকে স্বীকৃতি দেয় না। আপনি কেবল ত্রুটিটি পুনরুত্পাদন করতে পারেন:

[ 7. -gt 1 ]

যদি আপনি আপনার প্রশ্নে আরও স্ক্রিপ্ট যোগ করেন, | আমি বলতে পারি যে এটি কোথা থেকে আসছে।

হালনাগাদ

সম্পূর্ণ স্ক্রিপ্টের দিকে তাকিয়ে আমি কেবল লাইনটি প্রতিস্থাপন করব:

result=$(echo "$used / $total * 100" |bc -l|cut -c -2)

সঙ্গে:

result=$(( 100 * used / total ))

যেহেতু usedএবং totalপূর্ণসংখ্যা এবং bashপূর্ণসংখ্যার গাণিতিক হয়, তবে দ্রষ্টব্যটি স্থানান্তর শুরুতে 100 হওয়া উচিত। অথবা আপনি যদি সঠিক গোলটি নিশ্চিত করতে চান (গণনার ক্ষেত্রে 'পূর্ণসংখ্যা বিভাগ' সর্বদা কার্যকরভাবে গোল হয়ে যায়):

result=$( printf '%.0f' $(echo "$used / $total * 100" | bc -l) )

এটি নিশ্চিত করবে যে কোনও পিছনে বিন্দু নেই result। ব্যবহার করার পদ্ধতিটি cutখুব ভাল ধারণা নয় কারণ এটি কেবল 10-99 সীমার ফলাফলের জন্য বৈধ। এটি result0-9 (আপনার ক্ষেত্রে যেমন) এবং 99 এর উপরে সংখ্যাগুলির জন্য ব্যর্থ হবে ।

আপডেট 2

থেকে @ নিচে স্টিফেন এর মন্তব্য , আপনি যখন প্রান্তিক মান তুলনায় বৃত্তাকার নিচে থেকে ভাল হয়। এটি বিবেচনা করে, প্রশ্নে স্নিপেটের সাথে আরও একটি ছোট ত্রুটি রয়েছে - warn_levelএবং এর জন্য ব্যবহৃত তুলনাগুলির মধ্যে অসঙ্গতি লক্ষ্য করুন critical_level। জন্য তুলনা warn_levelসঠিক, কিন্তু critical_levelব্যবহারের -leপরিবর্তে (ক্ষুদ্রতর বা সমান) -lt(ঠিক ক্ষুদ্রতর)। কখন resultথেকে কিছুটা বড় তা বিবেচনা করুন critical_level- এটি critical_levelসমালোচিত সতর্কতাটির দিকে গোল হয়ে যাবে এবং ট্রিগার করবে না যদিও তা হওয়া উচিত (এবং যদি -ltতুলনাটি ব্যবহার করা হত)।

সম্ভবত কোনও ইস্যু খুব বেশি নয়, তবে এখানে সংশোধিত কোডটি দেওয়া হয়েছে:

if [ "$result" -lt "$warn_level" ]; then
  echo "Memory OK. $result% used."
  exit 0;
elif [ "$result" -lt "$critical_level" ]; then
  echo "Memory WARNING. $result% used."
  exit 1;
else
  echo "Memory CRITICAL. $result% used."
  exit 2;
fi

-geপরীক্ষার এছাড়াও অপ্রয়োজনীয় যেহেতু এইসব ক্ষেত্রে পৌঁছনোর জন্য আপনাকে প্রযোজ্য elif/ else, তাই সরানো হয়েছে।


2
যাইহোক, থ্রেশহোল্ডগুলির বিরুদ্ধে পরীক্ষা করতে, আপনি চূড়ান্ত করতে চান না । সতর্কতা থ্রেশহোল্ড 50 হলে 49.6 এখনও ঠিকresult=$(( 100 * $used / $total )) হওয়া উচিত So তাই ঠিক হওয়া উচিত।
স্টাফেন চেজেলাস

0

সুতরাং আমি কীভাবে মোটেও awkখুব ভাল ব্যবহার করতে জানি না । তবে আমি জানি যে আপনি লিখিত লিখিত স্ক্রিপ্টে যা চলছে তা হ'ল প্রচুর বোকা এবং নীচের মতো কিছু কাজ করা উচিত। আমি দুঃখিত আমি এটি পুরোপুরি ভাল লিখতে পারি না, তবে যেহেতু আপনি ইতিমধ্যে কল করছেন awk- দ্বিগুণ মনে হচ্ছে - আপনার এমন কিছু ব্যবহার করা উচিত।

_chkmem() { return $( 
    free -m | grep "buffers/cache"
        awk '{ 
        percent = ( $3 / ( $3 + $4 ) ) * 100     
        warn = '"${warnlevel?No warning level specified!}"' < percent ? WARNING : OK
        crit = '"${critical?No critical level specified!}"' < percent ? CRITICAL : $warn
        print "Mem $crit : $percent% used"
        if ( $crit != OK ) exit 1
    }')
}

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