실행중인 프로세스에서 ulimit 설정 -c unlimited결국 충돌을 잡아서

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



답변

최신 버전의 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을 더 읽기 쉽다).


답변

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


답변