![Como configuro o log para ulimits?](https://rvso.com/image/38703/Como%20configuro%20o%20log%20para%20ulimits%3F.png)
Eu queria saber se alguma coisa é registrada quando qualquerlimitessão atingidos (arquivos abertos, etc.). Em caso afirmativo, onde isso está registrado e o que devo procurar? Estou usando o CentOS 6.
Responder1
Você pode usarauditoriapara registrar as falhas das chamadas de sistema correspondentes (syscalls), embora nem todo excesso se manifeste desta forma. Por exemplo como
Henk Langeveldapontado, exceder RLIMIT_RTTIME
faz com que o kernel envie um sinal.
Tomemos por exemplo oRLIMIT_NOFILE
limite:
Especifica um valor maior que o número máximo do descritor de arquivo que pode ser aberto por esse processo. Tentativas (
open
(2),pipe
(2),dup
(2), etc.) exceder esse limite gera o erroEMFILE
. (Historicamente, esse limite foi nomeadoRLIMIT_OFILE
no BSD.)
Então você terá que monitorar, por exemplo, o open
syscall. Isso épágina de manualdiz:
VALOR DE RETORNO
open()
,openat()
ecreat()
retorne o novo descritor de arquivo ou -1 se ocorreu um erro (nesse caso,errno
está definido adequadamente).ERROS
open()
,openat()
ecreat()
pode falhar com os seguintes erros:
EMFILE
- O processo já está com o número máximo de arquivos abertos.
Isso significa que você precisa auditar os open
syscalls que falham com o EMFILE
. A página de manual sugere que open
retorne -1 e defina errno
como EMFILE
, mas o que realmente acontece é que oopen
chamada de sistemaretorna -EMFILE
eglibc converteem -1 e define errno
como EMFILE
* .
Agora que esclarecemos 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 Red Hat Enterprise Linux 6 tem um"Auditoria de Sistema"capítulo onde você pode ler mais sobre o assunto.
* Obrigado vá paradinheiropor apontar isso.
Responder2
Você precisa inspecionar a fonte do kernel para isso.
Exemplo:
Os temporizadores de CPU no kernel Linux (posix-cpu-timers.c) apenas enviará um SIGKILL para o processo infrator quando o limite rígido for atingido. O limite flexível aciona um SIGXCPU uma vez por segundo e uma mensagem Watchdog.
Você pode procurar outros limites e/ou sinais para obter mais detalhes.