জিএনইউ যখন 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 )
:কী করবে? এটি আমার কাছে বোধগম্য হবে এটি সেমিকোলন ছিল;...