我的系统出现错误“打开的文件太多”。我调查了这个错误,结果发现/usr/bin/uwsgi
创建的套接字(?) 超过 1020 个。如果创建的套接字超过 1020 个,我猜就会出现上述错误。
因此,我尝试运行一个 shell 脚本来监视打开文件的数量,如果超过 1000 个,则终止其 PID 以解决此阶段的错误。
#uwsgimonitor.sh
#!/bin/bash
#filename=/usr/bin/uwsgi
filename=/usr/bin/uwsgi
Cnt= lsof | awk '/uwsgi/ {print $1,$2}' | uniq -c | sort -r | head -1 | awk '{print $1}'
PROCESS_ID = lsof | awk '/uwsgi/ {print $1,$2}' | uniq -c | sort -r | head -1 | awk '{print $2}'
if [ $Cnt gt 1000 ]
then
echo "Found the number of socket open exceeds $Cnt."
kill -9 $PROCESS_ID
else
echo "" #nothing to do.
fi
在 crontab 中,我添加了此行,但它似乎并没有杀死我想要的 PID。
* * * * * sh /home/root/scripts/uwsgimonitor.sh
我错过了什么?
先感谢您。
答案1
对于那些想知道我的情况如何的人。
#!/bin/bash
count=$(lsof | awk '/uwsgi/ {print $1,$2}' | uniq -c | sort -r | head -1 | awk '{print $1}')
PROCESS_ID=$(lsof | awk '/uwsgi/ {print $1,$2}' | uniq -c | sort -r | head -1 | awk '{print $2}')
expectLimit=1000
echo "open socket:$count"
echo "pid:$PROCESS_ID"
if [[ ${count} -gt ${expectLimit} ]]
then
echo "Found uwsgi exceeds limit :${expectLimit}"
kill -9 $PROCESS_ID
else
echo "" #nothing to do.
fi
这个对我有用。谢谢。