![如何配置 ulimit 的日誌記錄?](https://rvso.com/image/38703/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20ulimit%20%E7%9A%84%E6%97%A5%E8%AA%8C%E8%A8%98%E9%8C%84%EF%BC%9F.png)
我想知道是否有任何內容被記錄極限值被擊中(打開文件等)。如果是這樣,它記錄在哪裡,我應該尋找什麼?我使用的是 CentOS 6。
答案1
您可以使用審計記錄對應系統呼叫 (syscalls) 的失敗,儘管並非所有多餘的情況都以這種方式顯示。例如作為
亨克·朗格維爾德指出,超過RLIMIT_RTTIME
會導致核心發送訊號。
我們以RLIMIT_NOFILE
限制:
指定一個比該進程可以開啟的最大檔案描述符數大一的值。嘗試(
open
(2)、pipe
(2)、dup
(2) 等)超過此限制會產生誤差EMFILE
。 (歷史上,這個限制是RLIMIT_OFILE
在 BSD 上命名的。)
因此,您必須監視例如open
係統呼叫。它是手冊頁說:
傳回值
open()
、openat()
、 並creat()
傳回新的檔案描述符,如果發生錯誤則傳回 -1(在這種情況下,errno
已適當設定)。錯誤
open()
、openat()
、 和creat()
可能會失敗並出現以下錯誤:
EMFILE
- 該行程已經開啟了最大數量的檔案。
這意味著您必須審核open
失敗的系統呼叫EMFILE
。手冊頁建議open
返回 -1 並設定errno
為EMFILE
,但實際發生的情況是open
系統調用返回-EMFILE
和glibc 皈依者它變成 -1 並設定errno
為EMFILE
*。
現在我們已經解決了這個問題,讓我們新增一條審核規則:
[root@h ~]# auditctl -a always,exit -F arch=`uname -m` -S open \
-F uid=ciupicri -F exit=-EMFILE -k "UL-SE"
讓我們測試一下極限:
[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'
並檢查日誌:
[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"
...
Red Hat Enterprise Linux 6 的「安全指南」有一個《系統審核》您可以在其中閱讀有關該主題的更多資訊。
*謝謝去法切指出這一點。
答案2
您需要為此檢查內核原始碼。
例子:
Linux 核心中的 CPU 定時器(posix-cpu-timers.c) 當達到硬限制時,只會向有問題的進程發送 SIGKILL。軟體限制每秒觸發一次 SIGXCPU 和一則看門狗訊息。
您可以搜尋其他限制和/或訊號以獲取更多詳細資訊。