मैंने एक सर्वर एप्लिकेशन लॉन्च किया है और मैं इसे परीक्षण के उद्देश्य से लंबे समय तक चलाना चाहता हूं। दुर्भाग्य से, मैं ulimit -c unlimited
एक अंतिम दुर्घटना को पकड़ने और उसका निरीक्षण करने से पहले सेट करना भूल गया । क्या मैं कुछ कर सकता हूँ?
मैंने एक सर्वर एप्लिकेशन लॉन्च किया है और मैं इसे परीक्षण के उद्देश्य से लंबे समय तक चलाना चाहता हूं। दुर्भाग्य से, मैं ulimit -c unlimited
एक अंतिम दुर्घटना को पकड़ने और उसका निरीक्षण करने से पहले सेट करना भूल गया । क्या मैं कुछ कर सकता हूँ?
जवाबों:
लिनक्स के हाल के संस्करणों पर (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
, 4
x86-64 पर लिनक्स पर संख्यात्मक मान )। "असीमित" के लिए, उपयोग करें RLIM_INFINITY
, आमतौर पर -1
। आपको जांचना चाहिए /usr/include/bits/types.h
कि आकार क्या rlim_t
है; मैं मान रहा हूँ long long
(यह वास्तव में अहस्ताक्षरित है, लेकिन एक हस्ताक्षरित प्रकार का उपयोग करने से "असीमित" -1 पढ़ने में आसान हो जाता है)।
उबंटू 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 या उसके बाद के साथ काम करता है।
gdb
तकनीक वास्तव में अच्छी है। एक चेतावनी, ऐसा लगता है कि आप अपनी हार्ड सीमा से अधिक एक गैर-रूट प्रक्रिया के लिए खुली फाइलों की संख्या में वृद्धि नहीं कर सकते हैं ,setrlimit
कॉल -1 और इरनो 22 (अमान्य तर्क) है।