실행중인 프로세스에서 ulimit 설정


25

서버 응용 프로그램을 시작했으며 테스트 목적으로 오랫동안 실행하고 싶습니다. 불행히도, 나는 ulimit -c unlimited결국 충돌을 잡아서 검사 하기 전에 설정하는 것을 잊었습니다 . 내가 할 수있는 일이 있습니까?

답변:


39

최신 버전의 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, 4x86-64의 Linux 에서는 숫자 값) 에도 동일하게 적용됩니다 . "무제한"의 경우 RLIM_INFINITY일반적 으로을 사용하십시오 -1. /usr/include/bits/types.h크기 가 얼마 인지 확인해야합니다 rlim_t. 나는 가정한다 long long(실제로 부호는 없지만 부호있는 유형을 사용하면 "무제한"-1을 더 읽기 쉽다).


+1이 gdb기술은 정말 멋집니다. 한 가지주의 사항 은 루트가 아닌 프로세스 의 하드 제한을 초과 하는 열린 파일 수를 늘리지 못하고setrlimit 호출은 -1을 반환하며 errno는 22 (잘못된 인수)입니다.
Steve Kehlet

2

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 이상에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.