Bir sunucu uygulaması başlattım ve test amacıyla uzun süre çalıştırmak istiyorum. Ne yazık ki, daha önce ulimit -c unlimited
meydana gelen bir kazayı yakalamak ve incelemeyi unutmayı unuttum . Yapabileceğim bir şey var mı?
Bir sunucu uygulaması başlattım ve test amacıyla uzun süre çalıştırmak istiyorum. Ne yazık ki, daha önce ulimit -c unlimited
meydana gelen bir kazayı yakalamak ve incelemeyi unutmayı unuttum . Yapabileceğim bir şey var mı?
Yanıtlar:
Linux'un son sürümlerinde (2.6.36'dan beri), prlimit
kaynak sınırlarını isteğe bağlı bir işlemde belirlemek için komut ve sistem çağrısını kullanabilirsiniz (uygun izinler verilir):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Sen prlimit komutu için linux-2.21-util gerekmez, ancak çağırmak için birlikte hızlı bir programı atmak gerekir prlimit sistemi çağrıyı aksi:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Yeterince yeni bir Linux sürümünüz (veya başka bir işletim sistemi) yoksa, bildiğim tek düzeltme işlemle bağlantı kurmak gdb
ve setrlimit
hata ayıklayıcıdan vermektir:
$ 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
Bu ayarı içindir ulimit -m
, RLIMIT_AS = 9
; aynısı için de geçerlidir ulimit -c
( RLIMIT_CORE
, 4
Linux’taki x86-64’deki sayısal değer ). "Sınırsız" için RLIM_INFINITY
genellikle kullanın -1
. /usr/include/bits/types.h
Boyutunun ne olduğunu kontrol etmelisiniz rlim_t
; Sanırım long long
(aslında imzasız, ancak imzalı bir tür kullanmak "sınırsız" -1 okunmasını kolaylaştırıyor).
Ubuntu 14.04 Trusty util-linux-2.21 olmadığından (2.20'dir), prlimit
kullanılacak CLI komutu yoktur .
Python3.4 + 'ı kullanarak (Ubuntu 14.04 ve sonraki sürümlerde kullanılabilir) çalışan bir işlem için kaynak sınırını belirleyebilir. Kök olarak çalıştır:
1-astar:
# 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
Veya daha fazla ayrıntılı:
# 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)
İşe yaradığını doğrulayın:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Bunun Linux 2.6.36 veya üstü ile çalıştığını ve glibc 2.13 veya üstü ile çalıştığını unutmayın.
gdb
teknik gerçekten harika. Bir uyarı, kök sınırını aşmayan köklü bir işlem için açık dosya sayısını artıramayacağınız görülüyor ,setrlimit
çağrı -1 döndürür ve errno 22'dir (geçersiz argüman).