আমি কোনও স্ক্রিপ্টকে কীভাবে বন্দরে অনুরোধগুলি গ্রহণের প্রক্রিয়াটির জন্য অপেক্ষা করতে বলি?


33

আমার একটি কমান্ড দরকার যা একটি নির্দিষ্ট বন্দরে অনুরোধগুলি গ্রহণের প্রক্রিয়াটির জন্য অপেক্ষা করবে।

লিনাক্সে এমন কিছু আছে যা তা করে?

while (checkAlive -host localhost -port 13000 == false)
  do some waiting

...

উত্তর:


52

কোনও সার্ভার সংযোগ গ্রহণ করছে কিনা তা দেখার জন্য সেরা পরীক্ষাটি আসলে সংযোগ করার চেষ্টা করা। আপনার সার্ভার যে কোনও প্রোটোকল কথা বলে তার জন্য নিয়মিত ক্লায়েন্ট ব্যবহার করুন এবং কোনও অপ-কমান্ড চেষ্টা করুন।

আপনি যদি হালকা ওজনের টিসিপি বা ইউডিপি ক্লায়েন্ট চান তবে খোল থেকে খালি চালনা করতে পারেন, নেটক্যাট ব্যবহার করুন । কীভাবে কোনও কথোপকথন প্রোগ্রাম করবেন তা প্রোটোকলের উপর নির্ভর করে; অনেকগুলি প্রোটোকল একটি নির্দিষ্ট ইনপুটটিতে সার্ভারটি সংযোগ বন্ধ করে দেয় এবং নেটক্যাটটি তখন প্রস্থান করবে।

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


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

@ উইল: এটি খুব আলাদা প্রশ্ন! আমি আলাদা উত্তর লিখেছি।
গিলস

1
আমি নেটকাট সলিউশনটিও পছন্দ করি। আমার ব্যবহার করে একটি স্ক্রিপ্ট রয়েছে nc -w 2 </dev/null >/dev/null- যদি সংযোগটি 2 সেকেন্ডের বেশি সময় নেয় তবে এটি বার হয়ে যায় এবং ব্যর্থ হয় - যা আমার ব্যবহারের পক্ষে সহজ।
প্রাক্তন

এফওয়াইআই, আমি 'পাই না যখন এনসি-কিউ 1 লোকালহোস্ট 13000 </ dev / নাল; ঘুমাও 10; কাজ 'এক। এটি ঠিক সঙ্গে সঙ্গে ফিরে আসে। প্রথমটি যদিও ভাল কাজ করে। ধন্যবাদ!
এলিস পারসিভাল

@ ফ্লাইটি nc -q 1 localhost 13000 </dev/nullতত্ক্ষণাত্ ফিরে আসে যদি কোনও সার্ভার শুনছে না, তবে এটি একটি ত্রুটি কোড নিয়ে ফিরে আসে, তাই লুপটি এটি ঘুমায় এবং কয়েক সেকেন্ড পরে আবার চেষ্টা করে।
গিলস'স 17-

17

আপনার যদি ব্যাশ এবং কোরিউটিলস রয়েছে (যেমন সময়সীমা, ঘুম), তবে এনসি / এলএসফ / নেটস্যাট নয়, আপনি এই সমাধানটি ব্যবহার করতে পারেন যা ব্যাশ যাদু টিসিপি সকেট ব্যবহার করে:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done

বিস্তারিতভাবে বলতে গেলে, বাশের "নেটওয়ার্ক পুনর্নির্দেশগুলি" টিসিপি সকেটে সংযোগ স্থাপনের Bash চ্ছিক
jhntellsall

7

টিসিপি সকেট ম্যাজিকের সাথে পূর্ববর্তী উদাহরণ অনুসরণ করে bash, এখানে একটি বর্ধিত সংস্করণ দেওয়া হয়েছে যা সীমিত সময়ের মধ্যে সংযোগের জন্য অপেক্ষা করে।

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

পার্থক্যটি হ'ল যদি সংযোগের সময় উপলব্ধ না হত 15s- - এটি চিরতরে লুপ হবে না তবে ত্রুটি কোড সহ প্রস্থান করবে।

প্রারম্ভের পরে পরিষেবা প্রস্তুতি / প্রাপ্যতার জন্য অপেক্ষা করতে এটি স্ক্রিপ্টগুলিতে দরকারী।

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