আমার কমান্ডের শেষে এটি কীভাবে '&' হয়েছিল, স্ক্রিপ্টটি এসও দ্রুত করেছে?


18

অনলাইনে কয়েকটি সিটিএফ চ্যালেঞ্জগুলি সমাধান করার সময়, আমি এমন একটি পরিস্থিতি পেয়েছিলাম যেখানে আমার একটি সার্ভারকে আঘাত করার দরকার হয়েছিল। এটি আমি লিখেছি কোড:

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done

এটি অবিশ্বাস্যরকম, বেদনাদায়ক ধীর ছিল । আমার 1000 থেকে 9999 এর মধ্যে সংমিশ্রণগুলি চেষ্টা করার দরকার ছিল এবং এটি প্রতিটি 10 ​​টির জন্য প্রায় 5 সেকেন্ড সময় নেয়। তারপরে, একটি পরামর্শ অনুসরণ করে, আমি এই রেখার শেষে একটি 'এবং' রেখেছি:

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &

এবং, এটি কয়েক সেকেন্ডের মধ্যে 100 এর সমন্বয় চেষ্টা করেছে। আমি খুবই আশ্চর্য ছিলাম. কেউ আমাকে যুক্তি ব্যাখ্যা করতে পারে? 'এবং' কী করেছিল?


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

এটি এটিকে ব্যাকগ্রাউন্ডে চালিত করেছে, আপনার এটি দেখতে হবে এটি আসলে শেষ।
ডিসপ্লেনেম

7
আপনি কি 1000 এর নীচে পরীক্ষা করতে চান না? দয়া করে ব্যবহার করুনfor i in {1000..9999}
ওয়াল্টার

2
পোর্টগুলি সমান্তরালভাবে সময় শেষ হওয়ার কারণে এটি স্ক্রিপ্টটি দ্রুত চালিত করে তোলে possible waitযদিও আপনার শেষে একটি অন্তর্ভুক্ত করা উচিত ।
ব্র্যাচলে

আপনি কি তাকান nc -z localhost 1000-2000?
ওয়াল্টার

উত্তর:


30

যুক্ত করা &একটি পটভূমি প্রক্রিয়া তৈরি করে।

আপনি যদি লিখেন a; b, এটি কমান্ডটি চালাবে, এটি aশেষ হওয়ার জন্য অপেক্ষা করুন, তারপরে bক্রমানুসারে কমান্ড চালান ।

আপনি যদি লিখেন তবে a & bএটি aএকটি পটভূমি প্রক্রিয়া হিসাবে উত্সাহিত করবে । এটি শেষ হওয়ার জন্য অপেক্ষা করবে না এবং এটি bঅবিলম্বে চলতে শুরু করবে । এটি একবারে চালানো হবে।

শেলটিতে পরীক্ষা করে আপনি এটি দেখতে পাচ্ছেন। আপনি যদি Xইনস্টল করে থাকেন তবে xtermকী হয় তা দেখার একটি ভাল উপায়: টাইপিং

$ xterm

অন্য একটি টার্মিনাল উইন্ডোটি খোলার কারণ হবে এবং প্রথমটি এটি বন্ধ না করা পর্যন্ত অপেক্ষা করবে। আপনি যখন এটি বন্ধ করবেন কেবলমাত্র আপনি নিজের শেলটি ফিরে পাবেন। টাইপ করলে

$ xterm &

তারপরে এটি ব্যাকগ্রাউন্ডে চলবে, এবং আপনি তত্ক্ষণাত আপনার শেলটি ফিরে পাবেন, xtermউইন্ডোটিও খোলা থাকবে।

সুতরাং আপনি যদি লিখুন

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt

এটা সংযোগ করে তোলে, স্ট্রিং, দোকান কি ফাইলে আসে আউট, এবং শুধুমাত্র পাঠায় তারপর তারপর পরবর্তী এক উপর চলে আসে।

মেক যোগ করা &অপেক্ষা করে না makes এটি একই সাথে কমবেশি তাদের দশ হাজারে চলতে থাকবে।

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

এর অর্থ এটিও হ'ল, আপনার ক্ষেত্রে এটি একবারে কম-বেশি দশ হাজার সংযোগ খোলার চেষ্টা করবে । অন্য প্রান্তটি কী পরিচালনা করতে পারে তার উপর নির্ভর করে তাদের মধ্যে কিছু ভাল ব্যর্থ হতে পারে। কেবল তা-ই নয়, তবে তারা যথাযথভাবে চলবে এমন কোনও গ্যারান্টি নেই, আসলে তারা প্রায় অবশ্যই তা করবে না, তাই আসলে কী শেষ হবে /tmp/me/dump.txtতা কারও অনুমান।

আউটপুটটি সঠিক ছিল কিনা তা আপনি পরীক্ষা করেছেন?


2
হ্যাঁ, আমি চ্যালেঞ্জটি সমাধান করেছি। সার্ভারটি সঠিক কোডটি সরবরাহ করা থাকলে পাসওয়ার্ডের সাথে প্রতিক্রিয়া জানাতে হয়েছিল। আমি ডাম্প। টেক্সট পরীক্ষা করার জন্য এই আদেশটি কার্যকর করেছি: .. $ cat dump.txt | sort | uniq -u এবং সঠিক পাসওয়ার্ড যুক্ত লাইনটি আমার কাছে প্রকাশিত হয়েছিল।
শিখুনএক্স

16
@ ইনটেলিকিড: আমার অর্থ অভদ্র হওয়ার অর্থ নয়, তবে এটি নিছক ভাগ্যের মধ্য দিয়ে কাজ করেছে। কেবল অর্ডারটি গুরুত্বপূর্ণ নয়, সার্ভারের প্রতিক্রিয়াগুলি ncলেখার বাফারের চেয়ে ছোট ছিল । যদি এটি না ঘটে থাকে তবে সার্ভারের প্রতিক্রিয়াগুলি সম্ভবত আন্তঃবাহিত হয়ে যেত। উদাহরণস্বরূপ, আপনার যদি 1 বাইটের একটি লেখার বাফার থাকে, এবং প্রতিক্রিয়াগুলি ছিল 1111এবং 2222, আপনি সম্ভবত 11221212একটি ঝরঝরে পৃথক পৃথক চেয়ে ভাল কিছু দেখতে পেতেন 1111 2222
মেরিনাস

হ্যাঁ, আমি বুঝতে পেরেছি। এই কারণেই আমি এই যুদ্ধ খেলছি। আমি প্রতিটি স্তরে শিখি। যে শেখার সহায়তার জন্য আপনাকে ধন্যবাদ।
লার্নারএক্স

2

এনসি (নেটক্যাট) কমান্ডটি ব্যয়বহুল, সময় অনুসারে। এটি রিমোট সার্ভারের সাথে সংযোগ স্থাপন, ডেটা প্রেরণ, প্রতিক্রিয়ার জন্য অপেক্ষা করা এবং এটি ফিরিয়ে আনতে হবে।

ব্যবহার করে এবং আপনি মূলত একটি কমান্ডটি একটি পটভূমি প্রক্রিয়াতে কাঁটাচ্ছেন (একে "কাজ" বলা হয়)। নিজেই এটি দ্রুত চালায় না। তবে এর অর্থ এই নয় যে আপনার লুপটি আর অবরুদ্ধ নয় এবং পরবর্তী পুনরাবৃত্তিটি (পরবর্তী এনসি সহ) ইতিমধ্যে করতে পারে।

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

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

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