জিএনইউ যখন grep
তার ফলাফলটি লেখার চেষ্টা করে, এটি একটি শূন্য-বহির্গমন প্রস্থানের সাথে ব্যর্থ হবে, কারণ এর আউটপুট লেখার কোথাও নেই, কারণ এসএসএইচ সংযোগটি শেষ হয়ে গেছে।
এর অর্থ হল যে if
বিবৃতিটি সর্বদা else
শাখা গ্রহণ করে ।
এটি চিত্রিত করার জন্য (এটি আপনার ক্ষেত্রে ঠিক কী ঘটছে তা নয় , তবে এটি জিএনইউ যদি grep
তার আউটপুট লিখতে অক্ষম হয় তবে কী ঘটে তা দেখায় ):
$ echo 'hello' | grep hello >&- 2>&-
$ echo $?
2
এখানে আমরা উত্পাদিত grep
স্ট্রিংয়ের জন্য echo
, তবে আমরা উভয় আউটপুট স্ট্রিমগুলি বন্ধ করি grep
যাতে এটি কোথাও লিখতে না পারে। আপনি দেখতে পাচ্ছেন, জিএনইউর প্রস্থান স্থিতি grep
0 এর পরিবর্তে 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 )
:
কী করবে? এটি আমার কাছে বোধগম্য হবে এটি সেমিকোলন ছিল;
...