답변:
최신 버전의 Linux (2.6.36부터)에서 prlimit
명령 및 시스템 호출을 사용하여 임의 프로세스 (적절한 권한이 부여됨)에 대한 자원 제한을 설정할 수 있습니다.
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
prlimit 명령에는 util-linux-2.21이 필요하지만 prlimit 시스템 호출 을 호출하는 빠른 프로그램을 함께 실행할 수 있어야합니다 .
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
새로운 버전의 Linux (또는 다른 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의 Linux 에서는 숫자 값) 에도 동일하게 적용됩니다 . "무제한"의 경우 RLIM_INFINITY
일반적 으로을 사용하십시오 -1
. /usr/include/bits/types.h
크기 가 얼마 인지 확인해야합니다 rlim_t
. 나는 가정한다 long long
(실제로 부호는 없지만 부호있는 유형을 사용하면 "무제한"-1을 더 읽기 쉽다).
Ubuntu 14.04 Trusty에는 util-linux-2.21 (2.20)이 없으므로 prlimit
사용할 CLI 명령 이 없습니다 .
사용 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
glibc 2.13 이상에서는 Linux 2.6.36 이상에서 작동합니다.
gdb
기술은 정말 멋집니다. 한 가지주의 사항 은 루트가 아닌 프로세스 의 하드 제한을 초과 하는 열린 파일 수를 늘리지 못하고setrlimit
호출은 -1을 반환하며 errno는 22 (잘못된 인수)입니다.