एक चल रही प्रक्रिया पर ulimit की स्थापना


25

मैंने एक सर्वर एप्लिकेशन लॉन्च किया है और मैं इसे परीक्षण के उद्देश्य से लंबे समय तक चलाना चाहता हूं। दुर्भाग्य से, मैं ulimit -c unlimitedएक अंतिम दुर्घटना को पकड़ने और उसका निरीक्षण करने से पहले सेट करना भूल गया । क्या मैं कुछ कर सकता हूँ?

जवाबों:


39

लिनक्स के हाल के संस्करणों पर (2.6.36 के बाद से), आप 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);

यदि आपके पास लिनक्स (या किसी अन्य OS) का एक नया पर्याप्त संस्करण नहीं है, तो केवल एक ही फिक्स है जिसके बारे में मुझे पता है कि यह डिबगर से प्रक्रिया 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 के रूप में ट्रस्टी का कोई उपयोग-लिनेक्स-2.21 नहीं है (यह 2.20 है), prlimitउपयोग करने के लिए कोई सीएलआई कमांड नहीं है ।

Python3.4 + (जो कि Ubuntu 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 

ध्यान दें कि यह लिनक्स 2.6.36 या बाद में glibc 2.13 या उसके बाद के साथ काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.