শেল স্ক্রিপ্টটি লেখার চেষ্টা করা হচ্ছে যা সার্ভারকে দূর থেকে পরীক্ষা করে রাখে, তবে আমি লগআউট করার সময় এটি অন্য বিবৃতিতে পড়ে যায়


9

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

সমস্যাটি হ'ল যখন আমি ssh সংযোগ থেকে লগআউট করি &, কমান্ডের শেষে এটি চালানো সত্ত্বেও ./stest01.sh &, এটি স্বয়ংক্রিয়ভাবে অন্যটিতে পড়ে এবং নিরবচ্ছিন্নভাবে আমাকে মেইল ​​করে রাখে, যতক্ষণ না আমি আবার লগইন করি এবং এটি না মেরে।

#!/bin/bash
while true; do
    date > sdown.txt ;
    cp /dev/null pingop.txt ;
    ping -i 1 -c 1 -W 1 myserver.net > pingop.txt &
    sleep 1 ;
    if
        grep "64 bytes" pingop.txt ;
    then
        :
    else
        mutt -s "Server Down!" myemail@address.com < sdown.txt ;
        sleep 10 ;
    fi
done

1
আমি বাশ বিশেষজ্ঞ নই, তবে কোলন :কী করবে? এটি আমার কাছে বোধগম্য হবে এটি সেমিকোলন ছিল ;...
নেড 64

3
@ Ned64- এর :কিছুই করেনা। এটি এটি করার জন্য ডিজাইন করা হয়েছে। এখানে, পরীক্ষাটি উল্টানোর পরিবর্তে, তারা এটি আগে কোনও অনি-অপ্ট করতে ব্যবহার করে else
কুসালানন্দ

@ কুসালানন্দ ঠিক আছে, ধন্যবাদ ভেবেছি এটি একটি টাইপো যা সমস্যার ব্যাখ্যা দিতে পারে।
নেড 64

1
লগআউট করার পরে কেন কেউ শেল স্ক্রিপ্ট চালানোর চেষ্টা করবে তা নিয়ে আমি বিভ্রান্ত। ক্রোন বা সিস্টেমযুক্ত টাইমারগুলি কি এর চেয়ে ভাল পছন্দ হবে না?
ক্লিফ আর্মস্ট্রং

উত্তর:


20

জিএনইউ যখন grepতার ফলাফলটি লেখার চেষ্টা করে, এটি একটি শূন্য-বহির্গমন প্রস্থানের সাথে ব্যর্থ হবে, কারণ এর আউটপুট লেখার কোথাও নেই, কারণ এসএসএইচ সংযোগটি শেষ হয়ে গেছে।

এর অর্থ হল যে ifবিবৃতিটি সর্বদা elseশাখা গ্রহণ করে ।

এটি চিত্রিত করার জন্য (এটি আপনার ক্ষেত্রে ঠিক কী ঘটছে তা নয় , তবে এটি জিএনইউ যদি grepতার আউটপুট লিখতে অক্ষম হয় তবে কী ঘটে তা দেখায় ):

$ echo 'hello' | grep hello >&- 2>&-
$ echo $?
2

এখানে আমরা উত্পাদিত grepস্ট্রিংয়ের জন্য echo, তবে আমরা উভয় আউটপুট স্ট্রিমগুলি বন্ধ করি grepযাতে এটি কোথাও লিখতে না পারে। আপনি দেখতে পাচ্ছেন, জিএনইউর প্রস্থান স্থিতি grep0 এর পরিবর্তে 2।

এটি জিএনইউ-র কাছে বিশেষত grep, grepবিএসডি সিস্টেমগুলি একই আচরণ করবে না:

$ echo 'hello' | grep hello >&- 2>&-    # using BSD grep here
$ echo $?
0

এর প্রতিকারের জন্য, নিশ্চিত হয়ে নিন যে স্ক্রিপ্টটি আউটপুট তৈরি করে না। আপনি এটি দিয়ে এটি করতে পারেন exec >/dev/null 2>&1। এছাড়াও, আমাদের grepএর -qবিকল্পটি ব্যবহার করা উচিত যেহেতু আমরা এর থেকে আউটপুটটি দেখতে আগ্রহী নই (এটি সাধারণত গতি বাড়িয়ে দেবে grepকারণ এটি পুরো ফাইলটি বিশ্লেষণ করার প্রয়োজন হয় না, তবে এই ক্ষেত্রে এটি খুব কম তৈরি করে ফাইলটি এত ছোট হওয়ায় গতির পার্থক্য)।

সংক্ষেপে:

#!/bin/sh

# redirect all output not redirected elsewhere to /dev/null by default:
exec >/dev/null 2>&1

while true; do
    date >sdown.txt

    ping -c 1 -W 1 myserver.net >pingop.txt

    if ! grep -q "64 bytes" pingop.txt; then
        mutt -s "Server Down!" myemail@address.com <sdown.txt
        break
    fi

    sleep 10
done

আপনি pingমধ্যবর্তী ফাইলগুলির একটির প্রয়োজন অপসারণ করে সরাসরি পরীক্ষাও ব্যবহার করতে পারেন (এবং কেবলমাত্র কখনও ডেটস্ট্যাম্প ধারণ করে এমন অন্য মধ্যবর্তী ফাইল থেকে মুক্তি পান):

#!/bin/sh

exec >/dev/null 2>&1

while true; do
    if ! ping -q -c 1 -W 1 myserver.net; then
        date | mutt -s "Server Down!" myemail@address.com
        break
    fi

    sleep 10
done

উপরের স্ক্রিপ্টের উভয় প্রকারভেদে আমি হোস্টে পৌঁছাতে ব্যর্থ হলে লুপটি প্রস্থান করতে বেছে নিই, কেবল প্রেরিত ইমেলের সংখ্যা হ্রাস করতে। আপনি যদি পরিবর্তে সার্ভারটি আবার আসার প্রত্যাশা করেন তবে এর পরিবর্তে breakউদাহরণস্বরূপ sleep 10mবা অন্য কোনওটি দিয়ে প্রতিস্থাপন করতে পারেন।

আমি খুব সামান্য ব্যবহার করে না pingহিসাবে ব্যবহৃত বিকল্পগুলি সামান্য টুইট করেছি ।-i 1-c 1

সংক্ষিপ্ত (যদি না আপনি এটি ইমেইলগুলি প্রেরণ চালিয়ে যেতে চান তবে হোস্টটি অ্যাক্সেসযোগ্য নয়):

#!/bin/sh

exec >/dev/null 2>&1

while ping -q -c 1 -W 1 myserver.net; do
    sleep 10
done

date | mutt -s "Server Down!" myemail@address.com

প্রতি মিনিটে ক্রোন জব চলছে (সার্ভারটি অবিরত থাকলে প্রতি মিনিটে ইমেল প্রেরণ করা চালিয়ে যাবে):

* * * * * ping -q -c 1 -W 1 >/dev/null 2>&1 || ( date | mail -s "Server down" myemail@address.com )

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

4
exec </dev/null >/dev/null 2>&1শুরুর কাছাকাছি যোগ করে পুরো স্ক্রিপ্টের জন্য / থেকে / dev / নালকে সবকিছু পুনর্নির্দেশ করা আরও নিরাপদ হতে পারে । যেভাবে যদি উদাহরণস্বরূপ pingস্ট্যাডারকে কিছু লেখার সিদ্ধান্ত নেয় এটি কোনও সমস্যার কারণ হবে না।
গর্ডন ডেভিসন

@ গর্ডন ডেভিসন আমি এখান থেকে স্টিডিন টানার কারণটি সত্যিই দেখতে পাচ্ছি না /dev/null, তবে আমি আউটপুটটি সাজিয়েছি । পরামর্শের জন্য ধন্যবাদ.
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.