একটি চলমান প্রক্রিয়া ulimit সেট


25

আমি একটি সার্ভার অ্যাপ্লিকেশন চালু করেছি এবং আমি পরীক্ষার উদ্দেশ্যে এটি দীর্ঘ সময় চালাতে চাই। দুর্ভাগ্যক্রমে, আমি ulimit -c unlimitedএকটি ইভেন্ট ক্র্যাশ ধরা এবং এটি পরিদর্শন করার আগে সেট করতে ভুলে গিয়েছিলাম । আমি কি কিছু করতে পারি?

উত্তর:


39

লিনাক্সের সাম্প্রতিক সংস্করণগুলিতে (২.6.৩6 থেকে), আপনি prlimitএকটি স্বেচ্ছাসেবী প্রক্রিয়াতে (যথাযথ অনুমতি প্রদানের ক্ষেত্রে) রিসোর্স সীমা নির্ধারণ করতে কমান্ড এবং সিস্টেম কলটি ব্যবহার করতে পারেন :

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

প্রিমিট কমান্ডের জন্য আপনার ইউজার-লিনাক্স -২.২১ প্রয়োজন, তবে প্রিমিট সিস্টেম কলটি উপস্থাপন করার জন্য আপনার দ্রুত প্রোগ্রামটি একসাথে করতে সক্ষম হওয়া উচিত :

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

আপনার যদি লিনাক্সের নতুন যথেষ্ট সংস্করণ না থাকে (বা অন্য কোনও ওএস) তবে আমি যে ফিক্স সম্পর্কে অবগত তা হ'ল প্রক্রিয়াটির সাথে সংযোগ স্থাপন gdbএবং setrlimitডিবাগার থেকে ইস্যু করা:

$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0

এই সেটিং এর জন্য হয় ulimit -m, RLIMIT_AS = 9; ঠিক একইটি প্রযোজ্য ulimit -c( RLIMIT_CORE, 4x86-64-এ লিনাক্সের সংখ্যাসূচক মান )। "সীমাহীন" এর জন্য RLIM_INFINITY, সাধারণত ব্যবহার করুন -1/usr/include/bits/types.hআপনার আকারটি যাচাই করা উচিত rlim_t; আমি ধরে নিচ্ছি long long(এটি আসলে স্বাক্ষরবিহীন, তবে একটি স্বাক্ষরিত ধরণটি ব্যবহার করা "সীমাহীন" -1 পড়া সহজ করে তোলে)।


+1 gdbকৌশলটি সত্যিই দুর্দান্ত। একটি সতর্কতামূলক, মনে হচ্ছে আপনি কোনও হার্ড-সীমা setrlimitছাড়ানোর জন্য নন-রুট প্রক্রিয়ার জন্য খোলা ফাইলগুলির সংখ্যা বাড়িয়ে তুলতে পারবেন না , কলটি -1 দেয় এবং এরনো 22 (অবৈধ যুক্তি)।
স্টিভ কেহলেট

2

উবুন্টু 14.04 ট্রাস্টির কোনও ইউজ-লিনাক্স -২.২১ (এটি ২.২০) না থাকায় prlimit, ব্যবহারের জন্য কোনও সি এল এল কমান্ড নেই ।

ব্যবহার Python3.4 + + (যা উবুন্টু 14.04 এবং পরে সমস্ত সংস্করণের উপর উপলব্ধ) একটি চলমান প্রক্রিয়ার জন্য রিসোর্স সীমা সেট করতে পারেন। রুট হিসাবে চালান:

1-মাছ ধরার নৌকা:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

বা আরও ভার্জোজ:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

এটি কাজ করে যাচাই করুন:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

নোট করুন এটি লিনাক্স ২.6.৩6 এর সাথে বা পরে গ্লিবসি ২.১ 2. বা তার পরে কাজ করে।

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