Câu trả lời:
Trên các phiên bản gần đây của Linux (kể từ 2.6.36), bạn có thể sử dụng prlimit
lệnh và lệnh gọi hệ thống để đặt giới hạn tài nguyên trên một quy trình tùy ý (được cấp quyền phù hợp):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Bạn cần có-linux-2.21 cho lệnh prlimit, nhưng bạn sẽ có thể kết hợp một chương trình nhanh để gọi lệnh gọi hệ thống prlimit theo cách khác:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Nếu bạn không có phiên bản Linux mới (hoặc HĐH khác), cách khắc phục duy nhất tôi biết là kết nối với quy trình gdb
và vấn đề setrlimit
từ trình gỡ lỗi:
$ 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
Đây là để thiết lập ulimit -m
, RLIMIT_AS = 9
; chính xác áp dụng tương tự cho ulimit -c
( RLIMIT_CORE
, giá trị số 4
trên Linux trên x86-64). Đối với "không giới hạn" RLIM_INFINITY
, thường sử dụng -1
. Bạn nên kiểm tra /usr/include/bits/types.h
kích thước của rlim_t
nó là gì; Tôi giả sử long long
(nó thực sự không được ký, nhưng sử dụng loại đã ký giúp "không giới hạn" -1 dễ đọc hơn).
Vì Ubuntu 14.04 Trusty không có tiện ích-linux-2.21 (là 2.20), nên không có prlimit
lệnh CLI để sử dụng.
Sử dụng Python3.4 + (có sẵn trên Ubuntu 14.04 và tất cả các phiên bản mới hơn) có thể đặt giới hạn tài nguyên cho một quy trình đang chạy. Chạy bằng root:
1-lót:
# 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
Hoặc dài dòng hơn:
# 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)
Xác nhận nó hoạt động:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Lưu ý điều này hoạt động với Linux 2.6.36 trở lên với glibc 2.13 trở lên.
gdb
Kỹ thuật này thực sự rất tuyệt. Một cảnh báo, có vẻ như bạn không thể tăng số lượng tệp đang mở cho một quá trình không root vượt quá giới hạn cứng của nó,setrlimit
cuộc gọi trả về -1 và errno là 22 (đối số không hợp lệ).