আমি একটি সার্ভার অ্যাপ্লিকেশন চালু করেছি এবং আমি পরীক্ষার উদ্দেশ্যে এটি দীর্ঘ সময় চালাতে চাই। দুর্ভাগ্যক্রমে, আমি ulimit -c unlimited
একটি ইভেন্ট ক্র্যাশ ধরা এবং এটি পরিদর্শন করার আগে সেট করতে ভুলে গিয়েছিলাম । আমি কি কিছু করতে পারি?
আমি একটি সার্ভার অ্যাপ্লিকেশন চালু করেছি এবং আমি পরীক্ষার উদ্দেশ্যে এটি দীর্ঘ সময় চালাতে চাই। দুর্ভাগ্যক্রমে, আমি ulimit -c unlimited
একটি ইভেন্ট ক্র্যাশ ধরা এবং এটি পরিদর্শন করার আগে সেট করতে ভুলে গিয়েছিলাম । আমি কি কিছু করতে পারি?
উত্তর:
লিনাক্সের সাম্প্রতিক সংস্করণগুলিতে (২.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
, 4
x86-64-এ লিনাক্সের সংখ্যাসূচক মান )। "সীমাহীন" এর জন্য RLIM_INFINITY
, সাধারণত ব্যবহার করুন -1
। /usr/include/bits/types.h
আপনার আকারটি যাচাই করা উচিত rlim_t
; আমি ধরে নিচ্ছি long long
(এটি আসলে স্বাক্ষরবিহীন, তবে একটি স্বাক্ষরিত ধরণটি ব্যবহার করা "সীমাহীন" -1 পড়া সহজ করে তোলে)।
উবুন্টু 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. বা তার পরে কাজ করে।
gdb
কৌশলটি সত্যিই দুর্দান্ত। একটি সতর্কতামূলক, মনে হচ্ছে আপনি কোনও হার্ড-সীমাsetrlimit
ছাড়ানোর জন্য নন-রুট প্রক্রিয়ার জন্য খোলা ফাইলগুলির সংখ্যা বাড়িয়ে তুলতে পারবেন না , কলটি -1 দেয় এবং এরনো 22 (অবৈধ যুক্তি)।