এখনই এসএসএইচ সেশনে একটি প্রোগ্রাম চালানো থেকে আউটপুট থামানো


18

সমস্যা

আমি কমান্ডটি কার্যকর করি যা এসএসএইচের মাধ্যমে প্রচুর তথ্য আউটপুট করে। উদাহরণস্বরূপ, আমি নির্লিপ্তভাবে একটি লুপের ভিতরে ডিবাগ তথ্য যুক্ত করি যা মিলিয়ন বার কার্যকর করে, বা কেবল cat /dev/urandomকিক্সের জন্য চালায় ।

টার্মিনাল তথ্য দিয়ে বন্যা হয়।

উদাহরণস্বরূপ আমি কী সম্পর্কে কথা বলছি

আমি ASAP কমান্ডটি শেষ করে আমার প্রোগ্রামটি ঠিক করতে চাই। আমি কী প্রিন্ট করি সেদিকে খেয়াল নেই। এখন, জিনিসটি হ'ল আমি Ctrl+ Cএএসএপ টিপুন (উপরের উদাহরণে আমি কমান্ডটি চালানোর সাথে সাথে এটি চাপ দিয়েছি), তবে এখনও আমার প্রয়োজনীয় সমস্ত তথ্য মুদ্রণ করতে এটির সময় লাগে

আমি কি চেষ্টা করেছি

আমি টিপে চেষ্টা Ctrl+ + Cখুব একটা কঠিন এটা মজার ফলাফল ছিল যে যখন টার্মিনাল পরিশেষে ধরা:

OUTPUT HERE^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
^C^C

^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C

আমি এটি সম্পর্কেও পড়েছি Ctrl+ Sযা স্পষ্টতই টার্মিনালটি "স্টপ আউটপুট, আমাকে ধরতে হবে" বলতে বলা হয় তবে দৃশ্যত এটি কিছুই করে না।

বিবিধ বিবরণ

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

আমার এসএসএইচ ক্লায়েন্টটি CYGWIN_NT-6.1-WOW64 luna 1.7.30(0.272/5/3) 2014-05-23 10:36 i686 Cygwinটার্মিনাল টাইপ সেট সহ মিনিটটিওয়াইয়ের সাইগউইনে ( ) চালায় xterm-256color

এসএসএইচ সার্ভারটি দেবিয়ান ( Linux burza 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 i686 i686 GNU/Linux) এ চলছে ।


আপনি কোন সিস্টেমে আসল প্রোগ্রামগুলি চালাচ্ছেন যা আউটপুট উত্পাদন করে? লিনাক্স, ইউনিক্স, না উইন্ডোজ? লিনাক্স এবং ইউনিক্সকে গ্রহণ করা উচিত Ctrl-O, যার অর্থ "এই টার্মিনালে লেখা কোনও আউটপুট ফেলে দিন"।
মার্ক প্লটনিক

সার্ভারটি দেবিয়ানে চালিত হয়। প্রশ্ন সম্পাদনা। Ctrl-O তেমন কিছুই করেনি বলে মনে হচ্ছে। সম্ভবত এটি ক্লায়েন্ট জিনিস?
rr-

-jজাম্প স্ক্রোলিং সক্ষম করার জন্য আপনি বিকল্পটি দিয়ে আপনার এক্সটার্মটি শুরু করার চেষ্টা করতে পারেন । মূল সমস্যাটি হ'ল রিমোটটি টার্মিনাল উইন্ডোটি প্রদর্শন করার চেয়ে দ্রুত ডেটা প্রেরণ করতে পারে - ডিফল্টরূপে, প্রতিবার একটি নতুন লাইন প্রিন্ট হওয়ার সাথে সাথে উইন্ডোর সামগ্রীগুলিকে বিটব্লট করতে হয়। আপনার সিটিআরএল-সি রিমোট সিস্টেমের দ্বারা প্রাপ্ত হওয়ার সাথে সাথে পুরো প্রচুর ডেটা বাফার হয়ে যেতে পারে এবং আপনার টার্মিনাল প্রোগ্রামটি এগুলি সমস্ত প্রদর্শিত করার চেষ্টা করবে।
মার্ক প্লটনিক

কেবলমাত্র একটি ধারণা: আপনার যদি এমন কিছু সঠিক আদেশ থাকে যা আপনি সাধারণত দুর্ঘটনাক্রমে সম্পাদন করেন এবং সেগুলি প্রচুর আউটপুট উত্পন্ন করে, তবে কেন কেবলমাত্র কিছু এলিয়াস যুক্ত করবেন না .bashrc?
সিমোন

আপনি ssh এর পরিবর্তে মোশ ব্যবহার করতে পারেন: mosh.mit.edu
gmatht

উত্তর:


5

যে আউটপুট কিছু বাফার করা হবে। আপনি আপনার Ctrl+ Cদূরবর্তী প্রান্তে প্রেরণ করুন যা চলমান প্রোগ্রামকে বাধা দেয়। প্রোগ্রামটি বিদ্যমান এবং শেল আপনাকে আবার প্রম্পট দেখাতে অক্ষরগুলি প্রেরণ করে। প্রম্পটটি দেখানোর আগে আপনার স্ক্রীনটি প্রথমে আপনাকে যে সমস্ত ডেটা বাফার করেছিল এবং এটি ইতিমধ্যে আপনার দিকে চলে আসবে তা প্রদর্শন করবে।

আপনি যা জিজ্ঞাসা করছেন তা হল প্রোগ্রামটি থামানো এবং ট্রানজিটের ডেটা কোনওভাবে অদৃশ্য হয়ে যায়। এটি ইতিমধ্যে যাতায়াত হিসাবে এটি ঘটতে পারে না।

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


10

আমি সাধারণত আউটপুটটি চালিত করি lessযাতে এটির মাধ্যমে মারতে পারিlessq কীটি ব্যবহার না করে ।

$ cmd | less

উদাহরণ

$ cat /dev/urandom | less

   এসএস # 2

মারার পরে q+ Enterএটি ছেড়ে দেবে এবং আপনার সাধারণ টার্মিনালে ফিরে আসবে, এটিকে সুন্দর এবং পরিষ্কার রেখে।

কেন এমন হয়?

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

                                    এসএস # 1

এই প্রভাবটি অক্ষম / সীমাবদ্ধ করার জন্য আপনি STDOUT বাফারিং অক্ষম করতে পারবেন যা ব্যবহার করে জিনিসগুলিকে কিছুটা প্রতিক্রিয়াশীল করে তুলতে পারে stdbuf, তবে আপনার পছন্দ মতো জিনিসগুলি পেতে আপনাকে সম্ভবত এই সেটিংসের সাথে খেলতে হবে। STFOUT অপসারণ করতে আপনি এই কমান্ডটি ব্যবহার করতে পারেন:

$ stdbuf -o0 <cmd>

stdbufআপনার নিষ্পত্তির বিকল্পগুলির বিশদটির জন্য ম্যান পৃষ্ঠা :

    If MODE is 'L' the corresponding stream will be line buffered.  This 
    option is invalid with standard input.

    If MODE is '0' the corresponding stream will be unbuffered.

    Otherwise MODE is a number which may be followed by one of the 
    following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so
    on for G, T, P, E, Z, Y.  In this case the corresponding stream will be 
    fully buffered with the  buffer  size  set  to  MODE
    bytes.

বাফারিং কীভাবে কাজ করে তার একটি দুর্দান্ত পটভূমির জন্য আমি এই পিক্সেল বিটটি শিরোনামযুক্ত: স্ট্যান্ডার্ড স্ট্রিমগুলিতে বাফারিংয়ের দিকে নজর দেওয়ার পরামর্শ দিই । এটি এমনকি সুন্দর ছবি অন্তর্ভুক্ত।

তথ্যসূত্র


এটি যুক্তিযুক্ত যতক্ষণ আপনি মনে করতে |lessচান cmd, যা দুর্ভাগ্যক্রমে আমি প্রায়শই করি না। আপনি যদি চালনা করেন cmdতবে প্রাপ্তির আগে মুদ্রণ ফলাফলগুলি গণনা না হওয়া পর্যন্ত আপনার এখনও অপেক্ষা করতে হবে ^C
rr-

1
এটি আসলে কী হচ্ছে তা ব্যাখ্যা করে না। সর্বোপরি, কোনও পাইপ জড়িত নেই, তাই আপনি কোন বাফারটি উল্লেখ করছেন?
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

@ গিলস - দুঃখিত, বাফারটি স্ক্রিনে বাফার হবে।
slm

কি বাফার? কর্নালে? এক্সটার্মে?
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

@ গিলস - আমাকে এক মিনিট সময় দিন, আমি বিশদটি 8-)
স্ল্যাম

3

বাফারিংয়ের কয়েকটি স্তর রয়েছে। আপনি যখন টিপুনCtrl + Cটিপেন, এটি টার্মিনালে ডেটা নির্গমন থেকে প্রোগ্রামটি থামায়। এটি টার্মিনাল এমুলেটরটি প্রদর্শিত হয়নি এমন ডেটাগুলিকে প্রভাবিত করে না।

যখন আপনি খুব উচ্চ গতিতে ডেটা প্রদর্শন করছেন, টার্মিনালটি ধরে রাখতে পারবে না এবং পিছিয়ে যাবে। এখানে যা চলছে তা: এলোমেলো সংখ্যা তৈরির চেয়ে পাঠ্য প্রদর্শন করা অনেক বেশি ব্যয়বহুল। হ্যাঁ, এমনকি একটি বিটম্যাপ ফন্ট সহ - ক্রিপ্টোগ্রাফিক মানের মানের এলোমেলো সংখ্যার তুলনা তুলনায় ময়লা কম। (আমি কেবল আমার মেশিনে চেষ্টা করেছি এবং এক্স প্রসেসটি সিপিইউকে স্যাচুরেট করে দিয়েছিলxterm কয়েক% নিয়ে cat(এবং এলোমেলো সংখ্যার প্রজন্মের বিপরীতে গণনা করা হয়) সবে মাত্র 1% পৌঁছেছে। এবং এটি বিটম্যাপ ফন্টের সাথে।)

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

এটি যখন কোনও দূরবর্তী শেলের মধ্যে চলছে তখন ল্যাগটি আরও খারাপ হয়, কারণ উত্পাদিত ডেটাটি catপ্রথমে এসএসএইচ সংযোগের মধ্য দিয়ে যেতে হয়। আপনার Ctrl+ Cপ্রেসটিও এসএসএইচ সংযোগের মধ্য দিয়ে যেতে হবে; এটি কিছুটা উচ্চতর অগ্রাধিকার পায় (এটি ব্যান্ডের বাইরে প্রেরণ করা হয়েছে), তবে এটি আরও কিছুটা সময় নেয় যার মধ্যে আরও আউটপুট জমে থাকে। এসএসএইচ সংযোগ বন্ধ করার ক্ষেত্রে ট্রানজিটের সংক্ষিপ্ততার মধ্যে ডেটা দমন করার কোনও উপায় নেই (যা আপনি Enterতখন টিপে চাপতে পারেন ~.)।


সমস্যাটি এসএসএইচের সাথে সম্পর্কিত। STDOUT বাফার ইন্টারেক্টিভ মোডে ব্যবহার করা উচিত নয় তবে এসএসএইচ ইন্টারেক্টিভ মোডটি সঠিকভাবে পরিচালনা করতে পারে না। যদিও প্রচুর আউটপুট লেনদেনে আটকে থাকতে পারে এটি এসএসএইচ প্রক্রিয়া যা Ctrl + C প্রাপ্ত করে তাই যখন Ctrl + C দূরবর্তী থেকে পাস করা অসম্ভব হয়ে থাকে তখন আউটপুটটি মেরে ফেলা তার দায়িত্ব।
user4674453

@ ব্যবহারকারী4674453 আহ? Ctrl + C স্থানীয় আউটপুট মারার কথা নয়। এটি মোটেই কাজ নয় not এটি দূরবর্তী পার্শ্বে পৌঁছে দেওয়ার কথা, যা দূরবর্তী প্রক্রিয়াটিকে হত্যা করতে পারে বা নাও পারে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

"এটি দূরবর্তী পার্শ্বে পৌঁছে দেওয়ার কথা, যা দূরবর্তী প্রক্রিয়াটিকে হত্যা করতে পারে বা নাও পারে।" - এটিও করার কথা নয়। কেআইএলএল সিগন্যাল, সিটিআরএল + সি তাদের মধ্যে একটি জারি করছে, কেবল স্থানীয় প্রক্রিয়াজাতকরণের জন্য। যদি এটি স্থানীয় প্রক্রিয়াটির জন্য ব্যবহার না করা হয় তবে "অনুমিত" এর ধারণাটি মোটেই প্রযোজ্য নয়।
user4674453

@ user4674453 নং Ctrl + C হত্যার সংকেত নয়। এটি একটি বাধা সংকেত। এর ভূমিকাটি একটি ইন্টারেক্টিভ প্রম্পটে ফিরে আসা। এটি কেবল এমন প্রোগ্রামগুলিকে মেরে ফেলেছে যাতে ফিরে যাওয়ার কোনও ইন্টারেক্টিভ প্রম্পট নেই।
গিলস

"এটি একটি বাধা সংকেত" " কমান্ড হত্যা করার পক্ষে এটি একটি যুক্তি, সুতরাং এটি একটি কিল সংকেত। কখনও কখনও এটি পছন্দ হিসাবে POSIX সংকেত হিসাবে ডাকা হচ্ছে। "এর ভূমিকাটি একটি ইন্টারেক্টিভ প্রম্পটে ফিরে আসা It এটি কেবলমাত্র এমন প্রোগ্রামগুলিকে হত্যা করে যেগুলিতে ফিরে যাওয়ার কোনও ইন্টারেক্টিভ প্রম্পট নেই" " ঠিক !!! এবং এসএসএইচ আশানুরূপভাবে তা করে না।
user4674453

1

এটা তোলে একটি উপায় খুঁজে বের করার জন্য যথেষ্ট হওয়া উচিত কমান্ড। নিম্নলিখিত প্রস্তাবগুলির জন্য আপনার দ্বিতীয় ssh সংযোগ খোলা থাকতে পারে।killcat

  • খুব কমই এর CTRL+zচেয়ে বেশি কার্যকর হতে পারে CTRL+c: এটি দ্রুত উত্তর দিতে পারে। এর পরে আপনি কমান্ড স্থগিত করে আপনি এটির সাথে kill %1বা এটির কাজের নম্বরটি যা মারতে পারেন ।
    এটি এই আশায় যে আপনি এখনও পর্দা থেকে যে কোনও কিছু পড়তে সক্ষম হবেন (একটি বন্যার র্যান্ডম বাইনারি পাঠ্য সহজেই আপনার অক্ষরগুলির সেটকে গোলমেলে ফেলতে পারে)। গিলসের
    স্মরণে আপনি উইন্ডোটি ছোট করে রাখলে সম্ভবত প্রক্রিয়াটি মেরে ফেলার চেয়ে বাধাপ্রাপ্ত অনুরোধটি পড়তে সিস্টেমটি আরও দ্রুত হবে। সুতরাং স্থগিত / বিরতি, ন্যূনতম করুন, কিছুটা অপেক্ষা করুন, আবার সর্বোচ্চ করুন, এটিও একটি সমাধান হতে পারে। অবশ্যই একটি এসএসএস সংযোগের মাধ্যমে আমি আশা করি যে আপনার কিছুটা সময় অপেক্ষা করা উচিত।

  • অন্য টার্মিনাল / সেশনে আপনি জিজ্ঞাসা করতে পারেন pgrep cat(যদি বিড়ালটি কমান্ডটি আহ্বান করত) এবং সনাক্ত করতে পারেন বিড়াল প্রক্রিয়াটি আপনার সিপিইউ আরও বেশি ব্যবহার করছে। আপনি এটিকে আরও নির্ভুলতার সাথে সনাক্ত করতে পারেন pstree:

    pgrep cat | awk '। মুদ্রণ "pstree -sp" $ 1}' | sh | grep sshd

    মত একটি আউটপুট সঙ্গে উত্তর

    Init (1) ───sshd (1062) ───sshd (22884) ───sshd (22951) ───bash (22957) ───cat (23131)

    এই ক্ষেত্রে, আপনার কেবল বিড়াল পিআইডি মারতে হবে: 23131 মেরে ফেলুন

বিঃদ্রঃ:


1

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

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

সেটআপ করুন, প্রথমে আপনার সেশনগুলির সর্বাধিক হার সন্ধান করুন:

# Get transfer <TIME> of a large file (>10MB preferable)
/usr/bin/time -f "%e" cat <FILENAME>

# Get file <SIZE> in bytes
stat --printf="%s\n" <FILENAME>

# Calculate <RATE>
echo "<SIZE> / <TIME>" | bc

অবশেষে, আপনার আসল কমান্ডগুলি সেই অনুযায়ী থ্রোট্ট করুন।

<YOUR_COMMAND> | pv -qL <RATE>

উদাহরণ:

/usr/bin/time -f "%e" cat large_reference_file.txt
31.26

stat --printf="%s\n" cat large_reference_file.txt
17302734

echo "17302734 / 31.26" | bc
553510

# Throttle my command to 553510B/s
cat some_other_file.txt | pv -qL 553510

সময়ে সময়ে আপনার সংযোগের গতি কিছুটা কমলে আপনি কিছুটা কমিয়ে আনতে চাইতে পারেন। যদি এটি ডুবে যায়, আচরণটি ইস্যুতে ফিরে আসবে, একটি অ-প্রতিক্রিয়াশীল ctrl-c।

Thrচ্ছিক থ্রোটলেড বিড়াল ওরফে:

# bash
alias tcat='tcat(){ cat $@ | pv -qL 400k ; }; tcat'

# tcsh
alias tcat 'cat \!* | pv -qL 400k'

# usage: tcat <FILENAME>

এখন সিটিআরএল-সি প্রত্যাশা অনুযায়ী কাজ করে, সাথে সাথে যদি কোনও বাফার করা হয় তবে খুব অল্প করেই আউটপুটটিকে হত্যা করে।


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

0

লিনাক্সে একটি সফ্টওয়্যার রয়েছে যা এটি ঠিক সমাধান করে সমস্যাটি (অন্য কয়েকটি বিষয়ও) things আপনি এটি উইন্ডোজের একটি টার্মিনাল এমুলেটর থেকেও আবেদন করতে পারেন (আপনি উইন্ডোজ ব্যবহার করছেন বলে মনে হচ্ছে?)

মশ চেষ্টা করুন , এসএসএইচ বাইনারিগুলির জন্য প্রতিস্থাপন। এটি ঠিক এসএসএইচের মতো কাজ করে ( mosh user@hostnameপরিবর্তে আপনি এটি করতে পারেন )ssh user@hostname এবং এটি আপনার প্রত্যাশা মতো কাজ করবে, এমনকি ব্যক্তিগত কী প্রমাণীকরণ ইত্যাদি করবে will

এটি সার্ভারে মূলত একটি পৃথক প্রক্রিয়া চালায় যা প্যাকেটগুলিকে বাফার করে। সুতরাং আপনি যখন মোশটিতে Ctrl + C টিপবেন, এটি এটি দূরবর্তী সার্ভারে পৌঁছে দেবে, যা অতিরিক্ত তথ্য প্রেরণ বন্ধ করে দেবে। তদাতিরিক্ত, এটি কী-স্ট্রোকের ফলাফলের পূর্বাভাসও জানায়, প্রতিবার আপনি কী টিপলে আপনাকে কয়েক মিলিসেকেন্ড বাঁচায়।

ডাউনসাইড: বর্তমানে মোশ ব্যবহার করার সময় ইতিহাসে স্ক্রোল করা সম্ভব নয়।

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