কীভাবে সিটিআরএল + সি / করবেন / যখন-লুপটি বাধাগ্রস্থ করবেন?


11

এই লুপ দেওয়া:

while sleep 10s ; do
  something-that-runs-forever
done

আমি যখন Ctrl + C টিপুন তখন পুরো লুপটি ব্যাহত হয়। আমি যা করতে চাই তা হ'ল "কিছু" বাধা দেওয়া - প্রসেস 10 সেকেন্ড কেটে যেতে দিন এবং তারপরে "কিছু" পুনরায় চালু করতে হবে।

আমি কীভাবে সিটিআরএল + সি তৈরি করব কেবল "কিছু" প্রভাবিত করব, এবং লুপটি না করে?

সম্পাদনা: সাইন ইন হিসাবে "বাধা" নষ্ঠ করুন। বাতিল। বিনষ্ট। "বিরতি" হিসাবে "বিরতি" না।


আপনি যদি কেবল এটি বিরতি দিতে চান তবে কেন Ctrl + Z ব্যবহার করবেন না, 10 সেকেন্ড অপেক্ষা করে দৌড়াবেন fg? কেন কেন Ctrl + C ব্যবহার করবেন?
টেরডন

@ এটারডন: মন্তব্যের জন্য ধন্যবাদ, আমি উত্তরটি নিয়ে ছুটে যেতে পারি।
ওপিএস

@ এটারডন: আমি এটি থামাতে চাই না। আমি যেমন লিখেছিলাম তেমন 10 সেকেন্ডও চাই।
বোস

আপনি বলেছিলেন: What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"। আপনি যদি Ctrl + Z টি আঘাত করেন, 10 সেকেন্ড অপেক্ষা করুন এবং তারপরে চালান fg, ঠিক এটিই ঘটবে। সম্ভবত আপনি নিজের প্রশ্নটি সম্পাদনা করতে পারেন এবং একটি নির্দিষ্ট উদাহরণ দিতে পারেন যাতে আমরা আরও ভাল করে বুঝতে পারি?
টেরডন

3
আমি ভেবেছিলাম যে সিআরটিএল + সি বাধাদানের প্রসঙ্গে স্পষ্টতই আমি ভুল ছিলাম ly আমি এখন সম্পাদনা করেছি।
বোস

উত্তর:


18

trap SIGINTআপনি কিছু করতে যদি এটি কাজ করা উচিত । লাইক :( true)।

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

বাধা দেওয়া something...শেলটিকে এখনই প্রস্থান করে না, কারণ এটি সংকেতটিকে উপেক্ষা করে। তবে, আপনি যদি sleepপ্রক্রিয়াটি থেকে থাকেন তবে এটি ব্যর্থতার সাথে প্রস্থান করবে এবং এর কারণে লুপটি বন্ধ হয়ে যায়। লুপটির sleepঅভ্যন্তরে সরান বা এড়াতে এমন কিছু যুক্ত করুন || true

মনে রাখবেন যে আপনি যদি trap "" INTসিগন্যালটিকে সম্পূর্ণ উপেক্ষা করতে (এটিতে কোনও আদেশ প্রেরণের পরিবর্তে) ব্যবহার করেন তবে এটি শিশু প্রক্রিয়াতেও উপেক্ষা করা হয়, তাই আপনি বাধা something...দিতে পারবেন না । এটি অন্তত বাশের নির্দেশিকায় স্পষ্টভাবে উল্লেখ করা হয়েছে :

তাহলে ARG নাল স্ট্রিং হয়, তাহলে প্রতিটি দ্বারা নির্দিষ্ট সংকেত sigspec শেল এবং কমান্ড এটা এমন কিছুকে ডাকে, দ্বারা উপেক্ষা করা হয়। [...] শেলের প্রবেশের সময় অগ্রাহ্য করা সংকেত আটকে বা পুনরায় সেট করা যায় না।


এটি কি বর্তমান শেলও অর্জন করা যায়? (কোনও স্ক্রিপ্টে নেই))

1
আপনি do (trap - INT; something-that-runs-forever)কমান্ডটি বিঘ্নিত হতে দিতে চাইবেন । এছাড়াও, আপনি রান প্রয়োজন হবে না :- আপনি অবশ্য একটি সংকেত উপেক্ষা করার একটি খালি স্ট্রিং ব্যবহার করতে পারেন: trap '' INT। এগুলি সবই পসিক্স এবং কোনও মেনে চলার শেল (কেবল বাশ নয়) এ কাজ করা উচিত।
টবি স্পিড

নোট যে লেখার SIGINTপূর্ণ কঠোরভাবে পোর্টেবল নয়: " ইমপ্লিমেনটেসন নাম অনুমতি পারে SIGউপসর্গ বা সংকেত নামে কেস উপেক্ষা একটি এক্সটেনশন হিসাবে (আমার জোর)"
টবি Speight

আপনি সিগন্যাল যেমন উপেক্ষা করার জন্য অ্যাকশন হিসাবে খালি স্ট্রিংটি পাস করতে পারেন উদাহরণস্বরূপ trap "" INT(এছাড়াও পিক্সিক্স)
ড্যাফ

@TobySpeight, কারণ আমি ব্যবহৃত trap :পরিবর্তে trap ""ঠিক ছিল যে, এর না সংকেত উপেক্ষিত আছে (কিন্তু এটি একটি নো-অপ পরিবর্তে), যাতে আমরা অন্য কিছু করতে প্রধান সাময়িক বিরতি পাবে প্রয়োজন হবে না somethingপ্রোগ্রাম।
ইলক্কাচু

0

অন্য বিকল্পটি হ'ল something-that-runs-foreverসিগন্যালটি হ্যান্ডেল করা (এটি পাওয়ার পরে কৌতুকপূর্ণভাবে প্রস্থান করা)। অবশ্যই, যখন কেবলমাত্র এই প্রোগ্রামটি অনেক স্ক্রিপ্টে ব্যবহৃত হয় এবং স্ক্রিপ্টের ক্রিয়াকলাপ চালিয়ে যাওয়ার জন্য CTRL+ এ পছন্দসই আচরণটি Cনিয়মতান্ত্রিকভাবে একই হয় - তখনই তা করা বুদ্ধিমান ।


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