কোনও প্রক্রিয়াটি কি লিনাক্সে সাময়িকভাবে হিমশীতল হতে পারে?


53

আমি ভাবছিলাম যে নির্দিষ্ট সময়ের জন্য কোনও প্রক্রিয়া হিমায়িত করার কোনও উপায় আছে কি?

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

উত্তর:


81

এখানে দেখুন

আছে দুই সংকেত দেয় যে একটি প্রক্রিয়া সঞ্চালনের স্থগিত করতে পারেন। একটি হ'ল "করুণাময়", এবং একটি "বলপ্রয়োগকারী"।

"গ্রেফুল" হ'ল SIGTSTPএবং এর উদ্দেশ্যটি প্রক্রিয়াটি "সুন্দরভাবে" জিজ্ঞাসা করা, যদি এটির মতো মনে হয় তবে দয়া করে এটি গ্রহণ না করা পর্যন্ত মৃত্যুদণ্ড স্থগিত করুন SIGCONT। এর ক্ষেত্রে SIGTSTP, প্রক্রিয়াটি SIGTSTP উপেক্ষা করতে পারে এবং যেভাবেই চালানো চালিয়ে যেতে পারে, সুতরাং এটি একটি প্রোগ্রামের সহযোগিতা প্রয়োজন যা SIGTSTP পরিচালনা করার জন্য ডিজাইন করা হয়েছে।

"বলপূর্বক" হ'ল SIGSTOPএবং এর উদ্দেশ্য হল সেই প্রক্রিয়াটির সাথে সম্পর্কিত সমস্ত ব্যবহারকারী স্থান থ্রেড স্থগিত করা। প্রক্রিয়াটিকে এড়ানো যেমন অসম্ভব SIGSTOPতেমনি এটি উপেক্ষা করাও SIGKILL(পরবর্তীকালে প্রসেসটিকে জোর করে হত্যা করা হয়)।

একটি অবাধ সংকেত পাঠানোর জন্য, এখানে উল্লিখিত বেশী কোন সহ, আপনি যেমন প্রোগ্রাম ব্যবহার করতে পারেন kill, killallঅথবা pkill; বা সিস্টেম কল ব্যবহার করুন kill(2)। উপরের যে কোনও সম্পর্কে প্ল্যাটফর্ম / আর্কিটেকচার / সংস্করণ-নির্ভর বিশদ এবং ত্রুটি-বিচ্যুতির জন্য আপনার অপারেটিং সিস্টেমের ম্যানেজগুলি দেখুন। নোট করুন যে এই সমস্ত কমান্ডে "কিল" শব্দটি এবং সিস্কালটি একটি খারাপ মিসনোমার। এই কমান্ডগুলি প্রক্রিয়া বন্ধ করতে একচেটিয়াভাবে ডিজাইন করা হয়নি । তারা করতে পারেন যে কি সংকেত নির্দিষ্ট বেশী পাঠিয়ে; তবে সিগন্যালগুলি কোনও প্রক্রিয়া বন্ধ করার পরিবর্তে কার্যকারিতার জন্যও ব্যবহৃত হতে পারে। উদাহরণস্বরূপ, SIGSTOPকেবলমাত্র প্রক্রিয়াটি স্থগিত করে, এবং এটি বেশ কয়েকটি সংকেতগুলির মধ্যে একটি যা এইভাবে পাঠানো যেতে পারে।

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

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

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

#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"

নোট করুন যে স্ক্রিপ্টটি শেষ হবে এবং নিয়ন্ত্রণকারী স্ক্রিপ্টটি শেষ হবে, তবে screenমনিটর প্রক্রিয়াটি নিয়ন্ত্রণের কারণে , এটি 10 ​​সেকেন্ডের জন্য পটভূমিতে চলতে থাকবে (প্রদত্ত যুক্তির উপর ভিত্তি করে sleep) এবং তারপরে জেগে উঠবে এবং শিশু প্রক্রিয়াটি চালিয়ে যাবে। তবে এটি নিয়ন্ত্রণকারী স্ক্রিপ্ট শেষ হওয়ার পরে দীর্ঘ হবে। আপনি যদি সিঙ্ক্রোনালি সময়টি কাটিয়ে ওঠার জন্য অপেক্ষা করতে চান তবে দ্বিতীয় কলটি screenএবং স্লিপ-হার্ড-কোডটি বাদ দিন এবং নিয়ন্ত্রণকারী স্ক্রিপ্টে কিল করুন।

আপনি পরীক্ষা করতে পারেন যে প্রক্রিয়াটি আসলে চালিত করে স্থগিত করে

screen -rS child

আপনি এই স্ক্রিপ্ট শুরু করার পরে। আপনি কনসোলে কিছুই দেখতে পাবেন না। তারপরে টাইমারটির (10 সেকেন্ড) মেয়াদ শেষ হওয়ার পরে, এটি আপনার স্ক্রিনটিকে বেস 64 এর ডেটা (0-9 এবং এএফ থেকে এলোমেলো অক্ষর) দিয়ে প্লাবিত করবে। প্রস্থান করতে Ctrl + C টিপুন।


পিওসি বাশ স্নিপেট সহ খুব ভাল খুব সম্পূর্ণ উত্তর। নিস!
fgysin

টিসিপি সংযোগের মতো নেটওয়ার্ক সেশনের মাঝখানে যদি কোনও প্রক্রিয়া হিমশীতল হয়ে যায়, যখন এটি চালিয়ে যায়, সেই নেটওয়ার্ক সেশনটি দূষিত বা ড্রপ হতে পারে? এটির জন্য কি কোনও সংজ্ঞায়িত আচরণ রয়েছে?
সিএমসিডিগ্রাগনকাই

@ সিএমসিড্রাগনকাই কারণ চলমান প্রক্রিয়া বন্ধ হওয়ার কারণে এটি কোনও এফডি থেকে পড়তে বা লিখতে পারে না, তবে কার্নেলটি টিসিপি সেশনে তার বাফার পূর্ণ না হওয়া পর্যন্ত বাইট স্থানান্তরিত করে রাখে, অর্থাৎ কার্নেল স্থান এবং ব্যবহারকারীর স্থানের মধ্যে কোনও স্থানান্তর হয় না। হিমায়িত প্রক্রিয়াগুলি পৃথক চেক https://www.kernel.org/doc/Docamentation/power/freezing-of-tasks.txt
নিজাম মোহাম্মদ

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

এই স্ক্রিপ্টটি অসহযোগিতামূলক কোডগুলিতে কোনও প্রভাব ফেলবে না: gist.github.com/ceremcem/864dd94b52ffe7b18da29558df4f1f5b
আনুষ্ঠানিকভাবে

14

হ্যাঁ, আপনি স্থগিত করার জন্য কোনও প্রক্রিয়াতে একটি স্টপ সিগন্যাল এবং তারপরে চালিয়ে যাওয়ার জন্য একটি কন্টেন্ট প্রেরণ করে এটি করতে পারেন ।

ব্যবহার:

kill -STOP <pid>

kill -CONT <pid>

11

আপনার যদি "ফ্রিজ" এর উপযুক্ত আলগা সংজ্ঞা থাকে তবে আপনি reniceকমান্ডটি পরীক্ষা করে দেখতে পারেন ।

রিনিস আপনাকে চলমান প্রক্রিয়াগুলির সময় নির্ধারণের অগ্রাধিকার পরিবর্তন করতে দেয়।

স্বাভাবিক প্রক্রিয়াটির দুর্দান্ত মান 0 হয় value "কেন আপনি প্রথমে যান না" তেমন ভাল মান বৃদ্ধি করা প্রক্রিয়াটিকে আরও সুন্দর করে তোলে। "আমার পথ থেকে বেরিয়ে আসুন, আমি তাড়াহুড়ো করছি" হিসাবে সুন্দর মান হ্রাস করার সময় একটি প্রক্রিয়াটি কম সুন্দর হয়ে যায়। সুন্দর মানের পরিধি -20 থেকে 19 হয়।

যে কেউ তাদের নিজস্ব প্রক্রিয়াগুলি সুন্দর করতে পারেন। কেবলমাত্র রুট একটি প্রক্রিয়াটিকে কম সুন্দর করতে পারে বা অন্য ব্যবহারকারীদের প্রক্রিয়াটি বিশেষত্ব পরিবর্তন করতে পারে।

আপনি যদি কোনও প্রসেসের জন্য ভাল মান 19 এ সেট করেন তবে এটি তখনই চলবে যখন সিস্টেমে অন্য কোনও কিছুই না চায়।

আমার স্থানীয় লিনাক্স বাক্সে রান করার একটি উদাহরণ এখানে দেওয়া হয়েছে।

ps -lএকটি প্রক্রিয়া ভাল মান দেখতে NI কলাম ব্যবহার করুন এবং তাকান।

-> পিএস-এল
এফএস ইউআইডি পিআইডি পিপিআইডি সি পিআরআই এনআই এডিডিআর এসজেড ডাব্লুসিএইচএন টিটিওয়াই সিএমডি
0 এস 29190 402 31146 0 75 0 - 16547 অপেক্ষা করুন পিটিএস / 0 বাশ
0 টি 29190 1105 402 0 75 0 - 23980 ফিনিস পিটিএস / 0 ভিআইএম
0 আর 29190 794 402 0 76 0 - 15874 - পিটিএস / 0 পিএস

চলমান renice +10তেজ প্রক্রিয়া তে এটি একটি নিম্ন অগ্রাধিকার চালানোর জন্য কারণ।

-> রেনিস +10 -পি 1105
1105: পুরানো অগ্রাধিকার 0, নতুন অগ্রাধিকার 10

-> পিএস-এল
এফএস ইউআইডি পিআইডি পিপিআইডি সি পিআরআই এনআই এডিডিআর এসজেড ডাব্লুসিএইচএন টিটিওয়াই সিএমডি
0 এস 29190 402 31146 0 76 0 - 16547 অপেক্ষা করুন পিটিএস / 0 বাশ
0 টি 29190 1105 402 0 95 10 - 23980 ফিনিস পিটিএস / 0 ভিআইএম
0 আর 29190 1998 402 0 78 0 - 15874 - পিটিএস / 0 পিএস

"সিস্টেমের অন্য কাউকে বিরক্ত করবেন না" এর অর্থ আপনি "হিমায়িত" প্রসারিত করতে পারবেন বলে ধরে নেওয়া আপনি এর মতো কিছু স্ক্রিপ্ট করতে পারবেন:

renice 20 -p <আগ্রহের পিড>
ঘুম <সময় নির্দিষ্ট পরিমাণ>
রেনিস 0-পি <আগ্রহের পিড>

(এটি রুট হিসাবে চালাতে মনে রাখবেন)।


নোট করুন যে আমি ps -lনীলের ছোট্ট নীল বাক্সগুলিতে সুন্দরভাবে প্রদর্শন করার জন্য আকর্ষণীয় কলামগুলি পেতে উপরের আউটপুটটির সাথে কিছুটা স্বাধীনতা নিয়েছি :)

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