আমার একটি কমান্ড দরকার যা একটি নির্দিষ্ট বন্দরে অনুরোধগুলি গ্রহণের প্রক্রিয়াটির জন্য অপেক্ষা করবে।
লিনাক্সে এমন কিছু আছে যা তা করে?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
আমার একটি কমান্ড দরকার যা একটি নির্দিষ্ট বন্দরে অনুরোধগুলি গ্রহণের প্রক্রিয়াটির জন্য অপেক্ষা করবে।
লিনাক্সে এমন কিছু আছে যা তা করে?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
উত্তর:
কোনও সার্ভার সংযোগ গ্রহণ করছে কিনা তা দেখার জন্য সেরা পরীক্ষাটি আসলে সংযোগ করার চেষ্টা করা। আপনার সার্ভার যে কোনও প্রোটোকল কথা বলে তার জন্য নিয়মিত ক্লায়েন্ট ব্যবহার করুন এবং কোনও অপ-কমান্ড চেষ্টা করুন।
আপনি যদি হালকা ওজনের টিসিপি বা ইউডিপি ক্লায়েন্ট চান তবে খোল থেকে খালি চালনা করতে পারেন, নেটক্যাট ব্যবহার করুন । কীভাবে কোনও কথোপকথন প্রোগ্রাম করবেন তা প্রোটোকলের উপর নির্ভর করে; অনেকগুলি প্রোটোকল একটি নির্দিষ্ট ইনপুটটিতে সার্ভারটি সংযোগ বন্ধ করে দেয় এবং নেটক্যাটটি তখন প্রস্থান করবে।
while ! echo exit | nc localhost 13000; do sleep 10; done
আপনি সংযোগ স্থাপনের পরে নেটকাটকে প্রস্থান করতেও বলতে পারেন। যদি কোনও সংযোগ না থাকে তবে এটি 1 এবং যদি 0 থাকে তবে আমরা এর আউটপুটটিকে প্রত্যাখ্যান করি। আপনার নেটকাটের সংস্করণ অনুসারে, এটি নিম্নলিখিত কমান্ডগুলির একটি বা উভয়কে সমর্থন করতে পারে:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
একটি বিকল্প পন্থা হ'ল শোনার সকেট খোলার জন্য সার্ভার প্রক্রিয়াটির জন্য অপেক্ষা করা।
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
আপনি যদি ম্যাক ওএসে থাকেন, নেটস্পট কিছুটা আলাদা আউটপুট ফর্ম্যাট ব্যবহার করে, সুতরাং আপনি নিম্নলিখিত ইনটাডটি চাইবেন:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
অথবা আপনি একটি নির্দিষ্ট প্রক্রিয়া আইডি লক্ষ্য করতে চাইতে পারেন:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
সকেটটি শোনার প্রক্রিয়াটি (যা একটি পোলিংয়ের পদ্ধতির এড়াতে পারে) ব্যবহারের সংক্ষিপ্তসার শোনার প্রক্রিয়াটির প্রতিক্রিয়া জানার কোনও উপায় আমি ভাবতে পারি না ptrace
।
nc -w 2 </dev/null >/dev/null
- যদি সংযোগটি 2 সেকেন্ডের বেশি সময় নেয় তবে এটি বার হয়ে যায় এবং ব্যর্থ হয় - যা আমার ব্যবহারের পক্ষে সহজ।
nc -q 1 localhost 13000 </dev/null
তত্ক্ষণাত্ ফিরে আসে যদি কোনও সার্ভার শুনছে না, তবে এটি একটি ত্রুটি কোড নিয়ে ফিরে আসে, তাই লুপটি এটি ঘুমায় এবং কয়েক সেকেন্ড পরে আবার চেষ্টা করে।
আপনার যদি ব্যাশ এবং কোরিউটিলস রয়েছে (যেমন সময়সীমা, ঘুম), তবে এনসি / এলএসফ / নেটস্যাট নয়, আপনি এই সমাধানটি ব্যবহার করতে পারেন যা ব্যাশ যাদু টিসিপি সকেট ব্যবহার করে:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
টিসিপি সকেট ম্যাজিকের সাথে পূর্ববর্তী উদাহরণ অনুসরণ করে bash
, এখানে একটি বর্ধিত সংস্করণ দেওয়া হয়েছে যা সীমিত সময়ের মধ্যে সংযোগের জন্য অপেক্ষা করে।
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
পার্থক্যটি হ'ল যদি সংযোগের সময় উপলব্ধ না হত 15s
- - এটি চিরতরে লুপ হবে না তবে ত্রুটি কোড সহ প্রস্থান করবে।
প্রারম্ভের পরে পরিষেবা প্রস্তুতি / প্রাপ্যতার জন্য অপেক্ষা করতে এটি স্ক্রিপ্টগুলিতে দরকারী।