আমি কীভাবে একটি CLOSE_WAIT সকেট সংযোগ সরিয়ে ফেলব


91

আমি একটি ছোট প্রোগ্রাম লিখেছি যা একটি নির্দিষ্ট পোর্টের একটি সার্ভারের সাথে যোগাযোগ করে। প্রোগ্রামটি দুর্দান্ত কাজ করে তবে:

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

এই সংযোগগুলি ফ্লাশ করার কোনও উপায় আছে?


4
আপনি পারবেন না (এবং করা উচিত নয়)। CLOSE_WAIT টিসিপি দ্বারা সংজ্ঞায়িত একটি রাষ্ট্র যা সংযুক্তিগুলি এটি স্বীকার করার জন্য অপেক্ষা করে বন্ধ রয়েছে for
ভনব্র্যান্ড

4
এছাড়াও ইউনিক্স.স্ট্যাকেক্সেঞ্জারভিউ / প্রশ্নস ১০০১০6/২ ... দেখুন ... যা আমি সদৃশ হিসাবে ভোট দেব না, কারণ প্রশ্নটি অফ-টপিক হিসাবে বন্ধ করে দেওয়া হবে।
ডারোবার্ট

4
@ ভনব্রান্ড না, এটি ঠিক বিপরীত। এটি এমন একটি সংযোগের জন্য রাষ্ট্র যা ইতিমধ্যে সমমনা দ্বারা বন্ধ হয়ে গেছে এবং স্থানীয় অ্যাপ্লিকেশনটির সমাপ্তির জন্য অপেক্ষা করছে।
মার্নকুইস লর্ন

আপনি যদি কমন্স এইচটিপিপিলেট ব্যবহার করছেন তবে nuxeo.com/blog/… এর কাছে প্রচুর প্রাসঙ্গিক তথ্য রয়েছে। আরএফসি 2616 থেকে, বিভাগ 14: এইচটিটিপি / 1.1 অ্যাপ্লিকেশনগুলি যে অবিচ্ছিন্ন সংযোগগুলি সমর্থন করে না তাদের প্রতিটি বার্তায় "বন্ধ" সংযোগ বিকল্পটি অন্তর্ভুক্ত করতে হবে।
মায়াঙ্ক আহুজা

উত্তর:


79

CLOSE_WAITমানে আপনার প্রোগ্রামটি এখনও চলছে, এবং সকেটটি বন্ধ করেনি (এবং কার্নেল এটি করার জন্য অপেক্ষা করছে)। যোগ -pকরার জন্য netstatPID পেতে, এবং তারপর এটি হত্যা আরও জোর (সঙ্গে SIGKILLপ্রয়োজন হলে)। এটি আপনার CLOSE_WAITসকেট পরিত্রাণ পেতে হবে । আপনি ব্যবহার করতে পারেনps পিডটি সন্ধান করতে ।

SO_REUSEADDRসার্ভার এবং TIME_WAITসকেটের জন্য তাই এখানে প্রয়োগ করা হয় না।


4
ভাল ... প্রক্রিয়া হত্যার কাজটি সেরা না হতে পারে যদি সেই প্রোগ্রামটি প্রচুর সংযোগ চালু করে, কেবলমাত্র "CLOSE_WAIT" এ থাকা কয়েকজনের মধ্যে: সেই ক্ষেত্রে প্রক্রিয়াটি হত্যার বিষয়টি সম্পূর্ণ অসম্ভব বা অনুপযুক্ত হতে পারে (প্রোগ্রামটি এখনও কাজ করে এবং পরিষেবাগুলি সরবরাহ করে, অন্য সংযোগগুলির সাথে)। কেবল মুলতুবি থাকা সংযোগটি বন্ধ করা অনেক বেশি উপযুক্ত হবে। তবে প্রকৃতপক্ষে এটি স্বয়ংক্রিয়ভাবে প্রোগ্রাম যা স্থানীয়ভাবে কানেক্টিনো বন্ধ করে দিচ্ছে না CL একটি বাগ রিপোর্ট উপযুক্ত হতে পারে
অলিভিয়ার ডুলাক

40

যেমনটি ক্রিস্ট ক্লার্ক বর্ণনা করেছেন ।

CLOSE_WAIT এর অর্থ হল যে সংযোগের স্থানীয় প্রান্তটি অন্য প্রান্ত থেকে একটি এফআইএন পেয়েছে, তবে ওএস স্থানীয় প্রান্তে প্রোগ্রামটির জন্য অপেক্ষা করছে যে এটি সংযোগটি বন্ধ করে দেবে।

সমস্যাটি হ'ল লোকাল মেশিনে আপনার প্রোগ্রামটি সকেটটি বন্ধ করছে না। এটি কোনও টিসিপি টিউনিংয়ের সমস্যা নয়। প্রোগ্রামটি সংযোগটি উন্মুক্ত রাখার সময় একটি সংযোগ (এবং বেশ সঠিকভাবে) চিরতরে CLOSE_WAIT এ থাকতে পারে।

একবার স্থানীয় প্রোগ্রাম সকেটটি বন্ধ করে দিলে, ওএস FIN প্রেরণ করতে পারে রিমোট প্রান্তে যা আপনাকে LAST_ACK এ রূপান্তর করে যখন আপনি FIN এর ACK এর জন্য অপেক্ষা করেন। এটি পাওয়ার পরে, সংযোগটি শেষ হয়ে যায় এবং সংযোগ টেবিল থেকে নেমে আসে (যদি আপনার শেষটি CLOSE_WAIT হয় তবে আপনি TIME_WAIT অবস্থায় শেষ করবেন না )।


4
কিভাবে সকেট বন্ধ করবেন ??
দিব্যাং শাহ

4
আপনি যে সকেটটি খোলেন সেটির কাছে আপনি হ্যান্ডেলটি বন্ধ করুন। আপনি কোন প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর নির্ভর করুন close()বা closesocket()ব্যবহার করুন।
রেমি Lebeau

8

আমি খুব সাম্প্রতিক টমক্যাট সার্ভার (7.0.40) এর সাথেও একই সমস্যাটি পেয়েছি। এটি কয়েক দিনের জন্য একবার অ-প্রতিক্রিয়াশীল হয়ে যায়।

উন্মুক্ত সংযোগগুলি দেখতে, আপনি ব্যবহার করতে পারেন:

sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT

এই পোস্টে উল্লিখিত হিসাবে , আপনি /proc/sys/net/ipv4/tcp_keepalive_timeমান দেখতে ব্যবহার করতে পারেন । মানটি সেকেন্ডে বলে মনে হচ্ছে এবং এটি ডিফল্ট 72২০০ (অর্থাত্ ২ ঘন্টা)।

এগুলি পরিবর্তন করতে, আপনাকে সম্পাদনা করতে হবে /etc/sysctl.conf

Open/create `/etc/sysctl.conf`
Add `net.ipv4.tcp_keepalive_time = 120` and save the file
Invoke `sysctl -p /etc/sysctl.conf`
Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time`

4
উত্তর বিভ্রান্তিকর। আপনি বলেছিলেন যে অ-প্রতিক্রিয়াশীল রাষ্ট্রগুলি বেশ কয়েক দিন ধরে চলে গেছে .. তবে আপনি জীবিত সময়টি কেবলমাত্র 120 সেকেন্ডে সেট করার চেষ্টা করেন। এমনকি ডিফল্ট মান (7200 সেকেন্ড) সহ, এটি বেশ কয়েক দিন স্থায়ী হওয়া উচিত নয়, তাই না?
fanchyna

8

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

আপনি চেক আউট করতে পারেন: https://github.com/rghose/kill-close-wait- সংযোগগুলি

এই স্ক্রিপ্টটি যা করে তা হ'ল এসিকে পাঠানো যা সংযোগটির জন্য অপেক্ষা করছিল।

এটিই আমার পক্ষে কাজ করেছিল।


আপনি ক্লোজ-ওয়েট সকেটে আইন পাঠান। কাজ না দিয়ে .. যদি কাজ করে তবে কেন?
চীনেক্সিং

আমি অনুমান করছি, ওএস ইতিমধ্যে দূরবর্তী হোস্টে FIN প্রেরণ করেছে। দূরবর্তী হোস্টটি সম্ভবত এসকেকে জবাব দিতে পারে না যে সকেটটি আশা করছে।
মেরাজ

হ্যাঁ, এটি ঠিক (কার্নেল কোড থেকে)। তবে আপনি যে প্যাকেট পাঠিয়েছেন তার SEQ সম্পর্কেও আমি সন্দেহ, যা "10", কার্নেল কি এটি পরীক্ষা করে না?
চীনেক্সিং

সম্ভবত না. আমি মনে করি আমি অনেক এলোমেলো সংখ্যা দিয়ে চেষ্টা করেছি এবং তারা কাজ করেছে বলে মনে হয়েছিল।
মেরাজ

3

এটি উল্লেখ করা উচিত যে Socketক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রে উদাহরণটি স্পষ্টভাবে প্রার্থনা করা প্রয়োজন close()close()এরপরে যদি কেবলমাত্র একটিরও অনুরোধ থাকে তবে সকেটটি CLOSE_WAIT অবস্থায় থাকবে।


3

আপনি জোর করে ssকমান্ড দিয়ে সকেট বন্ধ করতে পারেন ; দ্যssকমান্ড netstat কমান্ড থেকে সকেট পরিসংখ্যান এবং তথ্য প্রদর্শন অনুরূপ ফ্যাশন (সহজ যদিও এবং দ্রুত) ডাম্প করার জন্য ব্যবহৃত একটি টুল।

CLOSE_WAIT রাজ্যে যে কোনও সকেট মারতে, এটি চালান (মূল হিসাবে)

$ ss --tcp state CLOSE-WAIT --kill

1

এটিও লক্ষণীয় যে আপনার প্রোগ্রামটি যদি একটি নতুন প্রক্রিয়া তৈরি করে তবে সেই প্রক্রিয়াটি আপনার সমস্ত খোলার হ্যান্ডেলগুলির উত্তরাধিকারী হতে পারে। এমনকি আপনার নিজের প্রোগ্রাম বন্ধ হয়ে যাওয়ার পরেও, উত্তরাধিকারসূত্রে প্রাপ্ত হ্যান্ডলগুলি এখনও এতিম শিশু প্রক্রিয়াটির মাধ্যমে জীবিত থাকতে পারে। এবং তারা অগত্যা নেটস্ট্যাট মধ্যে একই একই প্রদর্শিত হবে না। তবে সর্বোপরি, এই শিশু প্রক্রিয়াটি জীবিত থাকাকালীন সকেটটি CLOSE_WAIT- এ ঝুলবে।

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

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