Ctrl-Z এবং কিল -স্টপ এর মধ্যে পার্থক্য কী?


14

আমি যখন makeশেল থেকে একটি কমান্ড চালিত করি ( বড় প্রকল্পে) তখন আমি প্রক্রিয়া বন্ধ করতে এবং শেলটিতে ফিরে আসতে Ctrl-Z লিখতে পারি। পরবর্তীকালে, আমি fgপ্রক্রিয়া চালিয়ে যেতে চালাতে পারি ।

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

make &
subpid="$!"

sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"

sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"

wait "$subpid"

দুর্ভাগ্যক্রমে, এটি কার্যকর হয়নি; প্রক্রিয়াতে SIGSTOP প্রেরণ এটি বিরাম দেয় নি (যেমন টার্মিনালে আউটপুট প্রেরণ চালিয়ে প্রমাণিত হয়েছে)। আমি make &কমান্ড লাইনে দৌড়ে এসে সিগস্টপ প্রেরণ করেছি এবং এর সাথে প্রক্রিয়া স্থিতি পরীক্ষা করেছি ps; এটি থামানো হিসাবে তালিকাভুক্ত করা হয়েছিল (এবং আমি আবার সিগনকন্ট পাঠালে আবার শুরু হয়েছিল) তবে এটি এখনও আউটপুট বানিয়ে আমার মূল তাপমাত্রা চালিয়ে যাচ্ছে! এটি সিটিআরএল-জেড দিয়ে থামানোর ক্ষেত্রে কখনও সমস্যা হয়নি, তবে স্ক্রিপ্টে কীভাবে এটি করবেন তা আমি জানি না।

কী Ctrl-Z আলাদা করে kill -STOPএবং শেল স্ক্রিপ্টে আমি কীভাবে আগেরটির আচরণ পেতে পারি?


এবং হ্যাঁ, makeপুনরাবৃত্তভাবে চালানো হচ্ছে। আসলে, আমি মনে করি এটি কয়েক স্তরের গভীরে যায়।
তাইমন

উত্তর:


12

কী Ctrl-Z আলাদা করে kill -STOPএবং শেল স্ক্রিপ্টে আমি কীভাবে আগেরটির আচরণ পেতে পারি?

CTRL-Zসাধারণত SIGTSTP প্রেরণ করে (যা অবরুদ্ধ করা যেতে পারে), এবং - অন্যান্য জিনিসগুলি বাদে শেলগুলি প্রায়শই এই উপলক্ষে পূর্ববর্তী সংরক্ষিত অবস্থায় পুনরায় সেট করে। আরও গুরুত্বপূর্ণ বিষয় হল, কন্ট্রোলিং টার্মিনাল প্রক্রিয়া গোষ্ঠীটি শেলের পিআইডি (এবং তারপরে আবার কোনও কাজের পিআইডি পুনরায় শুরু করা fg) সেট করা হয়।

আপনার মূল সমস্যার দিকে ফিরে যান: যেমন তাপমাত্রা নির্ভর ফ্রিকোয়েন্সি স্কেলিং ব্যবহার করা যেমন Cpufreqd আসলে আপনার পেরেকের জন্য আরও ভাল হাতুড়ি হতে পারে।


4

আপনি makeপ্রক্রিয়াটি থামাতে চান না ; আপনি makeপ্রক্রিয়া এবং এর সমস্ত শিশু প্রক্রিয়া বন্ধ করতে চান । আমি বাজি ধরেছি পুনরাবৃত্তির সাথে চালানো হচ্ছে।

আপনি চেষ্টা করতে set -mপারেন, তার %1পরিবর্তে ব্যবহার করুন "$subpid"

set -mসম্ভব "কাজ নিয়ন্ত্রণ", যা ডিফল্টভাবে ভিতরে স্ক্রিপ্ট বন্ধ। আমি মনে করি এটি আপনার ব্যবহারের ক্ষেত্রে কাজ করা উচিত, যদিও লোকেরা মনে হয় এটি সাধারণভাবে এটি একটি খারাপ ধারণা


4

আপনি যদি সেশন নেতার নেতিবাচক পিআইডি মান - পিজিআইডি নির্দিষ্ট করেন তবে আপনি একটি প্রক্রিয়া গোষ্ঠীর সমস্ত প্রক্রিয়াতে একটি সংকেত প্রেরণ করতে পারেন।

kill -STOP -"$subpid"

দ্রষ্টব্য: একটি নতুন সেশন ব্যবহার করে একটি প্রোগ্রাম চালানোর জন্য setsid make। তবে আপনার ক্ষেত্রে আমি এটির প্রয়োজন নেই বলে মনে করি। তবে, যদি মেকটি পুনরাবৃত্তভাবে চালানো হয় তবে মেকের প্রতিটি উদাহরণ তার নিজস্ব নেতা হতে পারে (আমি সে সম্পর্কে নিশ্চিত নই)।

আর একটি বিকল্প ব্যবহার করা যেতে পারে killall:

killall -STOP make

Ctrl + Z এবং হত্যা -স্টপ এর মধ্যে পার্থক্য:

  • Ctrl-Z আসলে টিএসটিপি প্রেরণ করে, যা অবরুদ্ধ করা যেতে পারে।
  • স্টপ অবরুদ্ধ করা যাবে না।

PGID পদ্ধতির কাজ না করে, এবং আউটপুট নিম্নলিখিত লাইন উত্পাদিত: /usr/local/bin/myscript: line 38: kill: (-10202) - No such process। পটভূমি প্রক্রিয়া চলতে থাকে। আমি মনে করি না যে killallপদ্ধতিটি কাজ করবে কারণ কিছু উপ-প্রসেসের shপরিবর্তে প্রদর্শিত হবে make
টায়মন

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

শেল থেকে ম্যানুয়ালি এটি করার পরে এটি কাজ শেষ হয়েছিল, তবে শেল স্ক্রিপ্টে নয়। আমি এটি ভাবছি কারণ আমি যখন এটি ম্যানুয়ালি করেছিলাম তখন মূল পিআইডি (যা অন্যরা তাদের পিজিআইডি উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল) প্রথম makeকমান্ডের ছিল, তবে যখন আমি স্ক্রিপ্টটি থেকেছিলাম তখন মূল পিআইডি শেল স্ক্রিপ্ট থেকেই ছিল itself ।
তাইমন

1

Ctrl+ + Cসংকেত একটি প্রক্রিয়া হত্যা করতে ব্যবহৃত হয় SIGINT, অন্য কথায় দ্বারা এটি একটি ভদ্র হয় হত্যা

Ctrl+ Z কোনও প্রক্রিয়াটিকে সিগন্যাল সিএসএসটিপি পাঠিয়ে স্থগিত করার জন্য ব্যবহৃত হয় , যা ঘুমের সিগন্যালের মতো, এটি পূর্বাবস্থায় ফিরে যেতে পারে এবং প্রক্রিয়াটি আবার শুরু করা যেতে পারে।

তবে যখন কোনও প্রক্রিয়া স্থগিত করা হয়, আমরা আবার fg (অগ্রভাগে পুনরায় শুরু) এবং bg (পটভূমিতে পুনরায় শুরু ) দ্বারা এটি আবার চালু করতে পারি, তবে আমি একটি নিহত প্রক্রিয়া পুনরায় শুরু করতে পারি না, এটি Ctrl+ C& Ctrl+ ব্যবহারের মধ্যে পার্থক্য Z

স্থগিত প্রক্রিয়াটি কীভাবে দেখুন ?

যখন আপনার একাধিক সাসপেন্ড কমান্ড রয়েছে, সেগুলি তালিকাভুক্ত করার জন্য, আপনি jobsকমান্ডটি ব্যবহার করবেন এবং আউটপুটটি হবে:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

ব্যাকগ্রাউন্ডে স্থগিত প্রক্রিয়াটি কীভাবে হত্যা করা যায় ?

killকমান্ড ব্যবহার করে :

kill %nযেখানে এন , কাজ নম্বর (কাজ আউটপুট থেকে বর্গাকার বন্ধনী মধ্যে একটি), তাই আমি বিড়াল বধ করতে চাই: kill %1

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