লিনাক্সে কোনও প্রোগ্রাম চলার সময়কে কীভাবে সীমাবদ্ধ করবেন?


10

আমার কাছে বেশ কয়েকটি সিমুলেশন রয়েছে, প্রত্যেকটির সাথে আমন্ত্রণ জানানো হয়েছে python simulate.py <parameter list>। এই সিমুলেশনগুলির সাথে সমস্যাটি হ'ল তাদের মধ্যে কয়েকটি বিনা ছাড়াই ঝুলছে যা আমাকে একটি সাধারণ স্ক্রিপ্টের সাথে ব্যাচে চালানো থেকে বাধা দেয়।

আমার যা দরকার তা হ'ল "রান-টাইম-সীমাবদ্ধতা" কমান্ডের একটি রূপ যা স্বয়ংক্রিয়ভাবে প্রক্রিয়াটি মেরে ফেলবে (প্রায়শই Ctrl + C চাপিয়ে দেওয়ার মাধ্যমে , তবে আমি মনে করি যে সাধারণ কিলও একইভাবে কাজ করবে) যদি নির্দিষ্ট সময়ের পরে, প্রক্রিয়াটি নিজেই কৃপণভাবে শেষ হয়নি।

অবশ্যই আমি যেমন স্ক্রিপ্ট নিজেই লিখতে পারেন, কিন্তু আমি সন্দেহ যে কেউ, ইতিমধ্যে এটা করা সম্ভব আমার সামনে তাই আমি চাকা সঙ্গে ঘণ্টা কাটানোর নতুন করে করতে হবে না ps, timeএবং ব্যাশ ম্যানুয়াল।

উত্তর:


15

সম্ভাব্য সমাধান # 1

timeoutকমান্ডটি ব্যবহার করুন :

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

প্রসেসটি timeoutকমান্ডের পাশাপাশি killপ্রসেসের জন্য প্রহরী রাখতে পারেন যদি কিছু সময়ের পরে এটি বন্ধ না হয়।

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

প্রক্রিয়াটি sleep 100থামার পরে এটি 20 সেকেন্ড পর্যন্ত অপেক্ষা করবে , যদি এটি এখনও চলছে, তবে timeoutএটি একটি killসংকেত প্রেরণ করবে ।

সম্ভাব্য সমাধান # 2

বিকল্প উপায়, যদিও আরও ঝুঁকিপূর্ণ পদ্ধতি নিম্নরূপ হবে:

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

স্ট্যাক ওভারফ্লোতে এই কৌশলটি শিরোনামের একটি প্রশ্নের মধ্যে পেয়েছে: লিনাক্সে কোনও প্রোগ্রাম চালুর সময় সীমিত করে । বিশেষত এই উত্তর

দ্রষ্টব্য: উপরোক্ত পদ্ধতিটি @mattdm দ্বারা দেওয়া একটি মন্তব্য ঝুঁকিপূর্ণ হতে পারে কারণ এটি এই ধারণাটি তৈরি করে যে আপনার প্রক্রিয়া থেকে কোনও নতুন প্রক্রিয়া শুরু হয়নি। সুতরাং নতুন কোনও পিআইডি নিয়োগ দেওয়া হয়নি। এটি প্রদত্ত, এই পদ্ধতির সম্ভবত ব্যবহার করা উচিত নয় তবে সমস্যাটির সাধারণ পদ্ধতির জন্য এটি কেবলমাত্র একটি রেফারেন্স হিসাবে রয়েছে। timeoutপদ্ধতি 2 ভালো বিকল্প।


তবে তারপরে গ্যারান্টি দেওয়া হবে যে স্ক্রিপ্টটি সর্বদা সময় নেয়। আমার ক্ষেত্রে এটি 1 সেকেন্ডের নয়, বরং 15 মিনিটের জন্য।
অ্যাডাম রাইজকোভস্কি

তবে এই প্রশ্নের অন্যান্য সমাধানটি আমার যা প্রয়োজন তা অবিকল করা উচিত। ধন্যবাদ!
অ্যাডাম রাইজকোভস্কি

2
ধরা যাক এর myProgram চেয়ে কম সময়ে শেষ হয় sleep(একটি সর্বাধিক অনুমোদিত রানটাইম সেট করা লক্ষ্য যেহেতু অযৌক্তিক অনুমান নয় )। তারপরে আপনি হয় অস্তিত্বহীন পিআইডি (কোনও প্রকৃত ক্ষতি হয়নি) বা সিস্টেমের যেকোন র্যান্ডম প্রক্রিয়াতে (সম্ভাব্য মারাত্মক) একটি সংকেত প্রেরণ করেন ।
একটি সিভিএন

1
@ মাইকেলKjörling, ফিবিব্যাকের জন্য ধন্যবাদ। ওপিটিও একই মন্তব্যে আমার উত্তর আপডেট করেছে। দেখে মনে হচ্ছে যে timeoutকমান্ডটি তিনি যা খুঁজছেন ঠিক তেমনই করছে, ওপি আমার মন্তব্যের জবাব দেওয়ার অপেক্ষায় রয়েছে।
slm

@ এসএলএম timeoutআমার সমাধান প্রয়োজন solution আমি এই মুহুর্তে এটি পরীক্ষা করছি
অ্যাডাম রাইজকোভস্কি

4

আমি কিছু একটু ভাল পেয়েছি চেয়ে timeout: timelimit

এর বিভিন্ন সুবিধা রয়েছে; একটি হ'ল ব্যবহারকারী "ম্যানুয়ালি" সিটিআরএল + সি টিপে মৃত্যুদন্ড কার্যকর করতে পারেন।

timelimitপ্রোগ্রাম ডেবিয়ান সংগ্রহস্থলের মধ্যে পাওয়া যায়।


1
পার্থক্যগুলি b / w সময়সীমার এবং সময়সীমা বোঝার চেষ্টা করা। সিআরটিএল + সি দিয়ে টাইমআউট বন্ধ করা যায়। অন্যান্য সুবিধা কি কি?
slm

ভাল, আমার সময়সীমা শেষ করতে পারে না। আমি পুদিনা 14 ব্যবহার করি (উবুন্টু কোয়ান্টালের উপর ভিত্তি করে)।
অ্যাডাম রাইজকোভস্কি

3

আপনি সিপিইউ সময় এবং অন্যান্য বিষয়গুলির সাথে টিউন করতে পারেন ulimit, সিপু সময়ের জন্য বিশেষত:

$ ulimit -t 60      # limit to 60 seconds
$ program

এই U&L প্রশ্নোত্তরটি দেখুন: unix.stackexchange.com/a/4666/7453 । @ গিলস এই উদ্দেশ্যে ইউলিমিটের ব্যবহার সম্পর্কে একটি ভাল ওভারভিউ দেয়।
slm

0

বাশ একটি পরিবর্তনশীল ব্যবহার করে যা $BASHPIDএটি এ জাতীয় পরিস্থিতিতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

তোমার কলে যুক্তি পরিবর্তন করতে পারেন sleepমধ্যে do_face()থেকে 100পরিবর্তে 10এবং দেখুন সেখানে কি ঘটে যখন শিশু তার chores করতে খুব দীর্ঘ সময় লাগে। কেবলমাত্র do_face()আপনার এক্সিকিউটেবলের কলটিতে ঘুমানোর জন্য কলটি পরিবর্তন করুন এবং যদি এটি খুব বেশি সময় নেয় তবে স্ক্রিপ্টটি এটি মেরে ফেলবে, 20সেকেন্ডটি এই উদাহরণের সীমাবদ্ধ মান। প্যারামিটারগুলি প্রয়োগ করা যেতে পারে যাতে এটি কল করার জন্য একটি সাধারণ স্ক্রিপ্ট হয়ে যায় এবং ব্যাচ বা অন্য যে কোনও কিছুতে অন্য স্ক্রিপ্ট দ্বারা কল করা যায়। প্রতিটি সমবর্তী প্রক্রিয়ার জন্য পিড ফাইলগুলি হ্যান্ডলিং এমন একটি সমস্যা যা হ্যান্ডেল করা দরকার, সম্ভবত বিভিন্ন সাব ডায়ার ব্যবহার করুন ...

এনবি: জিএনইউতে লিনাক্স এক সেকেন্ডের দশমাংশের জন্য ঘুমানোর sleepমতো ভাসমান পয়েন্ট আর্গুমেন্ট নিতে sleep 0.1পারে।

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