Pada versi Linux terbaru (sejak 2.6.36), Anda dapat menggunakan prlimit
perintah dan panggilan sistem untuk menetapkan batas sumber daya pada proses arbitrer (diberikan izin yang sesuai):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Anda memerlukan util-linux-2.21 untuk perintah prlimit, tetapi Anda harus dapat menyatukan program cepat untuk memanggil panggilan sistem prlimit jika tidak:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Jika Anda tidak memiliki versi Linux yang cukup baru (atau OS lain) satu-satunya perbaikan yang saya ketahui adalah terhubung ke proses dengan gdb
dan mengeluarkan setrlimit
dari debugger:
$ 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
Ini adalah untuk pengaturan ulimit -m
, RLIMIT_AS = 9
; persis sama berlaku untuk ulimit -c
( RLIMIT_CORE
, nilai numerik 4
di Linux pada x86-64). Untuk "tidak terbatas", gunakan RLIM_INFINITY
, biasanya -1
. Anda harus memeriksa /usr/include/bits/types.h
apa ukurannya rlim_t
; Saya berasumsi long long
(sebenarnya tidak ditandatangani, tetapi menggunakan tipe yang ditandatangani membuat "tak terbatas" -1 lebih mudah dibaca).
gdb
Tekniknya sangat keren. Satu peringatan, tampaknya Anda tidak dapat meningkatkan jumlah file yang terbuka untuk proses non-root melewati batas kerasnya,setrlimit
panggilan mengembalikan -1, dan errno adalah 22 (argumen tidak valid).Karena Ubuntu 14.04 Trusty tidak memiliki util-linux-2.21 (ini adalah 2.20), tidak ada
prlimit
perintah CLI untuk digunakan.Menggunakan Python3.4 + (yang tersedia di Ubuntu 14.04 dan semua versi yang lebih baru) dapat menetapkan batas sumber daya untuk proses yang sedang berjalan. Jalankan sebagai root:
1-liner:
Atau lebih verbose:
Verifikasi itu berfungsi:
Perhatikan ini bekerja dengan Linux 2.6.36 atau lebih baru dengan glibc 2.13 atau lebih baru.
sumber