有什么方法可以检查给定用户的 ulimit 的使用情况吗?我知道您可以在启动时更改单个进程的 ulimit,或者在运行时更改单个 shell 的 ulimit,但我希望能够“监视”用户距离达到其限制的程度。我计划编写一个bash
脚本,向 statsd 报告当前的使用百分比。具体来说,我想跟踪:
- 打开文件 (
ulimit -n
) - 最大用户进程数 (
ulimit -u
) - 待处理信号 (
ulimit -i
)
我想要的是使用百分比(0-100)。
答案1
也许这对第一个问题有帮助:
如果您知道特定用户的进程 ID (PID),您可以通过以下方式获取每个进程的限制:
cat /proc/<PID>/limits
您可以使用以下命令获取每个 PID 打开的文件数:
ls -1 /proc/<PID>/fd | wc -l
然后将 的值Max open files
与第二个命令中打开的文件描述符的数量进行比较以获得百分比。
答案2
通过几种不方便的方法和标准工具输出当前用户打开文件、进程和挂起信号的百分比:
paste <(grep 'open files\|processes\|pending signals' \
/proc/self/limits | cut -c27-38) \
<(i=`whoami`
lsof -n -u $i 2> /dev/null |
tail -n +2 |
awk {'print $9'} |
wc -l
ps --no-headers -U $i -u $i u | wc -l
ps -u $i -o pid= |
xargs printf "/proc/%s/status\n" |
xargs grep -s 'SigPnd' |
sed 's/.*\t//' |
paste -sd+ |
bc ; ) \
<(grep 'open files\|processes\|pending signals' \
/proc/self/limits |
cut -c1-19) |
while read a b name ; do
printf '%3i%% %s\n' $((${b}00/a)) "$name"
done
我的系统上的输出:
16% Max processes
12% Max open files
0% Max pending signals
假设这些数字很好,这个答案表明它可以在 shell 中完成,但可能不应该,除非有更好的 shell 方法。相反,这个问题最好用gcc
, 或python
,ETC。
答案3
ulimit 是进程的属性,并继承给子进程。
您无法获得另一个进程的限制。