কীভাবে চেক করবেন, কোন সীমা ছাড়িয়ে গেল? (Ulimit এর কারণে প্রক্রিয়াটি সমাপ্ত হয়েছে))


11

আসুন ধরে নেওয়া যাক সীমাহীন পরিবেশে প্রক্রিয়া চলছে:

(
ulimit  ... -v ... -t ... -x 0 ...
./program
)

প্রোগ্রামটি সমাপ্ত হয়।

অনেকগুলি কারণ থাকতে পারে: মেমরি / সময় / ফাইলের সীমা অতিক্রম করেছে; কেবল সহজ সেগফোল্ট; অথবা রিটার্ন কোড 0 সহ সাধারণ সমাপ্তি।

প্রোগ্রামটি সংশোধন না করে প্রোগ্রাম সমাপ্তির কারণ কী ছিল তা কীভাবে পরীক্ষা করবেন?

পিএস মানে "যখন বাইনারি দেওয়া হয়"। হতে পারে কিছু মোড়ক (ptrace-ing ইত্যাদি) সাহায্য করতে পারে?

উত্তর:


6

সাধারণভাবে বলতে গেলে, আমি মনে করি না আপনি দুর্ভাগ্যজনকভাবে পারেন। (কিছু অপারেটিং সিস্টেম এটির জন্য সরবরাহ করতে পারে তবে আমি যেগুলি সমর্থন করি তা সম্পর্কে আমি অবগত নই))

উত্স সীমা জন্য রেফারেন্স ডক: getrlimitPOSIX 2008 থেকে।

উদাহরণস্বরূপ সিপিইউ সীমা গ্রহণ করুন RLIMIT_CPU

  • প্রক্রিয়াটি নরম সীমা ছাড়িয়ে গেলে, এটি প্রেরণ করা হয় a SIGXCPU
  • প্রক্রিয়া যদি হার্ড সীমা ছাড়িয়ে যায় তবে এটি একটি সমতল হয়ে যায় SIGKILL

আপনি যদি wait()আপনার প্রোগ্রামটিতে পারেন তবে আপনি বলতে পারেন এটি দ্বারা হত্যা করা হয়েছে কিনা SIGXCPU। তবে আপনি SIGKILLবাইরে থেকে সরল পুরানো কিল থেকে কঠোর সীমা লঙ্ঘনের জন্য প্রেরিতকে আলাদা করতে পারেন না । আরও কী, যদি প্রোগ্রামটি পরিচালনা করে তবে XCPUআপনি বাইরে থেকে তা দেখতে পাবেন না।

একই জিনিস RLIMIT_FSIZE। প্রোগ্রামটি যদি এটি পরিচালনা না করে তবে আপনি স্থিতি SIGXFSZথেকে দেখতে wait()পারেন। তবে একবার ফাইলের আকারের সীমা অতিক্রম করলে, কেবলমাত্র ঘটে যাওয়া ঘটনাটি হ'ল আরও যে I / O সেই সীমাটি আবার পরীক্ষা করার চেষ্টা করে তা কেবল সহজেই পাবে EFBIG- এটি প্রোগ্রামটি অভ্যন্তরীণভাবে পরিচালনা করা হবে (বা না, দুর্ভাগ্যক্রমে)। যদি প্রোগ্রামটি হ্যান্ডেল করে SIGXFSZ, উপরের মতো - আপনি এটি সম্পর্কে জানতে পারবেন না।

RLIMIT_NOFILE? ভাল, আপনি এমনকি একটি সংকেত পাবেন না। openএবং বন্ধুরা কেবল EMFILEপ্রোগ্রামে ফিরে আসে। এটি অন্যথায় বিরক্ত করা নয়, সুতরাং সেই পরিস্থিতিতে ব্যর্থ হওয়ার যে কোনও উপায়ে কোড করা হয়েছিল তা (অথবা না) এটি ব্যর্থ হবে।

RLIMIT_STACK? পুরাতন ভাল SIGSEGV, একটি বিতরণ করার অন্যান্য কারণগুলির স্কোর থেকে আলাদা করা যায় না। (আপনি জানবেন যে এটিই প্রক্রিয়াটিকে হত্যা করেছিল, যদিও waitস্ট্যাটাস থেকে from )

RLIMIT_ASএবং RLIMIT_DATAকেবল তৈরি করবে malloc()এবং আরও কয়েকজন ব্যর্থ হতে শুরু করবে (বা SIGSEGVলিনাক্সের স্ট্যাকটি প্রসারিত করার সময় AS সীমাতে আঘাত হ্রাস পেলে গ্রহণ করুন)। প্রোগ্রামটি খুব ভালভাবে লেখা না থাকলে এটি সম্ভবত পর্যায়ে এলোমেলোভাবে ব্যর্থ হবে।

সুতরাং সংক্ষেপে, সাধারণত, ব্যর্থতা হয় অন্য প্রক্রিয়া মৃত্যুর কারণগুলির তুলনায় দৃশ্যমানভাবে পৃথক নয়, সুতরাং আপনি নিশ্চিত হতে পারবেন না, বা কখন / কখন / কীভাবে এগিয়ে চলেছে তা কোনও প্রোগ্রাম থেকে সিদ্ধান্ত নেওয়া হয়, তবে আপনি না বাইরে থেকে.

আমি যতদূর জানি আপনি সেরাটি করতে পারেন আপনার কোডটি কাঁটাচামচ লিখে কিছুটা কোড লিখুন, এটির জন্য অপেক্ষা করুন এবং:

  • সনাক্ত করতে প্রস্থান স্থিতি পরীক্ষা করুন SIGXCPUএবং SIGXFSZ(এএফআইকে, এই সংকেতগুলি কেবলমাত্র ওএস দ্বারা উত্স সীমাবদ্ধতার সমস্যার জন্য তৈরি করা হবে)। আপনার যথাযথ প্রয়োজনের উপর নির্ভর করে আপনি ধরে নিতে পারেন SIGKILLএবং SIGSEGVএটি সম্পদ সীমাতেও সম্পর্কিত ছিল তবে এটি কিছুটা প্রসারিত।
  • getrusage(RUSAGE_CHILDREN,...)অন্যগুলি সম্পর্কে একটি ইঙ্গিত পেতে আপনি নিজের প্রয়োগ থেকে কী বেরোতে পারেন তা দেখুন ।

ওএস-নির্দিষ্ট সুবিধাগুলি এখানে (সম্ভবত ptraceলিনাক্স, বা সোলারিসের মতো জিনিসগুলি dtrace) বা সম্ভবত ডিবাগার ধরণের কৌশলগুলি সহায়তা করার জন্য উপস্থিত থাকতে পারে তবে এটি আপনার নির্দিষ্ট প্রয়োগের সাথে আরও জড়িত হতে চলেছে।


(আমি আশা করছি যে অন্য যে কোনও জাদু বিষয়টির সাথে জবাব দেবে যা সম্পর্কে আমি সম্পূর্ণ অজানা))


ঠিক আছে. এই তিনটি সম্পর্কে কী: (মেমরি) স্মৃতি সীমা অতিক্রম করে (সময়) সময়সীমা, (ত্রুটি) অন্য ত্রুটি? চারপাশে মোড়ক তৈরি সম্পর্কে আমি জানি mallocতবে দুর্ভাগ্যক্রমে এটি মেমরির সমস্যাটি সাধারণভাবে সমাধান করে না, কারণ এটি সাধারণভাবে সিস্টেম কল brk(আমি ঠিক আছি?) সম্পর্কিত।
গ্রজেগোর্জ ওয়েয়ারজোওইকিকি

1
আপনি প্রোগ্রামটি নিয়ন্ত্রণ না করলে মোড়কানোর মালেক সাহায্য করবে না। আপনি হ্যাক সম্পর্কে মত কথা বলছি তাহলে LD_PRELOADআপনার "প্রক্রিয়া পরিবর্তন নয়" বাধ্যতা যে এর সীমান্তরেখা ing, এবং এটি একটি বিট সাহায্য করবে, কিন্তু না সত্যিই - malloc, brk, sbrkএবং mmapব্যর্থ হয়ে যাবে ENOMEM, ঠিক যেন আপনি সত্যিই একটি কম মেমরি অবস্থা ছিল (তবে স্মৃতির সীমা থেকে অনেক নিচে)। সময় সীমা RLIMIT_CPU, আমি প্রাচীর-ঘড়ির সময়সীমা জানি না।
মাদুর

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

1
সংস্থান সীমাবদ্ধতা লঙ্ঘন নয় এমন পরিস্থিতিতে সিগসিজিভি উত্থাপিত হতে পারে (নাল পয়েন্টার অবজ্ঞা সবচেয়ে সাধারণ বিষয় যা এটি উত্থাপন করে) - আপনি নিশ্চিত হতে পারবেন না যে এটি একটি উলিমিট আঘাত হ'ল এটির কারণ।
মাদুর

আমাকে সম্পর্কে নিশ্চিত করার জন্য ধন্যবাদ brk। যেমনটি আমি দেখছি, প্রয়োজনীয়তা 'প্রোগ্রাম এক্স, ওয়াই, জেড ...' সিগন্যালগুলি পরিচালনা করছে না ওয়েগপিডের জন্য ধন্যবাদ, সিএক্সএক্সসিপিইউ, সিগএক্সএফএসজেড, সিগসাইজিভি, সমস্যার সমাধান করবে। আমি কি সঠিক?
গ্রজেগোর্জ ওয়েয়ারজোইকিকি

3

আমি বর্তমানে একই ইস্যুতে কিছু কাজ করছি। আমি এটির একটি আংশিক সমাধান করতে সক্ষম হয়েছি। আমি অডিট সসবিসিস্টেম ব্যবহার করেছি। আপনি [1] এ কাজটি ট্র্যাক করতে পারেন।

[1] https://github.com/PaulDaviesC/Logging-limits.conf

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