Você pode usar auditoria para registrar as falhas das chamadas de sistema correspondentes (syscalls ), embora nem todo excesso se manifeste dessa maneira. Por exemplo, como
Henk Langeveld apontou, exceder RLIMIT_RTTIME
faz com que o kernel envie um sinal.
Tomemos por exemplo o RLIMIT_NOFILE
limite:
Specifies a value one greater than the maximum file descriptor number that can be opened by this process. Attempts (
open
(2),pipe
(2),dup
(2), etc.) to exceed this limit yield the errorEMFILE
. (Historically, this limit was namedRLIMIT_OFILE
on BSD.)
Portanto, você terá que monitorar, por exemplo, o open
syscall. Sua página de manual diz:
RETURN VALUE
open()
,openat()
, andcreat()
return the new file descriptor, or -1 if an error occurred (in which case,errno
is set appropriately).ERRORS
open()
,openat()
, andcreat()
can fail with the following errors:
EMFILE
- The process already has the maximum number of files open.
Isso significa que você precisa auditar as open
syscalls que falham com EMFILE
. A página man sugere que open
retorna -1 e define errno
a EMFILE
, mas o que acontece é que o open
syscall retorna -EMFILE
e glibc converte para -1 e define errno
para EMFILE
* .
Agora que corrigimos isso, vamos adicionar uma regra de auditoria:
[root@h ~]# auditctl -a always,exit -F arch='uname -m' -S open \
-F uid=ciupicri -F exit=-EMFILE -k "UL-SE"
Vamos testar os limites:
[ciupicri@h ~]$ ulimit -n 10
[ciupicri@h ~]$ python -c 'from __future__ import print_function; f = [(print(i), open("/etc/passwd")) for i in range(10)]'
0
1
2
3
4
5
6
7
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 24] Too many open files: '/etc/passwd'
E verifique os registros:
[root@h ~]# ausearch --start recent -k UL-SE
...
time->Wed Jun 25 21:27:37 2014
type=PATH msg=audit(1403720857.418:63): item=0 name="/etc/passwd" nametype=UNK
NOWN
type=CWD msg=audit(1403720857.418:63): cwd="/home/ciupicri"
type=SYSCALL msg=audit(1403720857.418:63): arch=40000003 syscall=5 success=no
exit=-24 a0=8ed72e0 a1=8000 a2=1b6 a3=8f24d11 items=1 ppid=1110 pid=1139 auid=
5000 uid=5000 gid=5000 euid=5000 suid=5000 fsuid=5000 egid=5000 sgid=5000 fsgi
d=5000 tty=pts3 ses=2 comm="python" exe="/usr/bin/python" subj=unconfined_u:un
confined_r:unconfined_t:s0-s0:c0.c1023 key="UL-SE"
...
O "Guia de Segurança" para o Red Hat Enterprise Linux 6 tem um " Auditoria do sistema " capítulo onde você pode ler mais sobre o assunto.
* Obrigado a fche por apontar isso.