情况是这样的,我这边办公环境是已经科学上网了,也就是在路由器里面配置了ss,大概有20台电脑同时在这个路由器下面,办公上网。断网情况是在中午发生的,就是莫名其妙的断网了,根据经验猜是不是ss进程挂了,路由器连不上了,就断网了。登上服务器一看,果然进程没了,启动后并没多想。可能是人多了 一个进程扛不住了?为了不影响大家的工作,先写个脚本来监控吧,如果挂掉了,立即启动,5秒判断一次,脚本很简单。死循环放到后台即可。

 

 1 #!/bin/bash
 2 
 3 while true;
 4 do
 5     num=$(ps axu | grep "ssserver" | grep -v "grep" | wc -l)
 6     time=$(date "+%Y-%m-%d %H:%M:%S")
 7     if [ $num -eq 0 ];then
 8         /usr/bin/ssserver -c /etc/shadowsocks.json -d start
 9         echo "$time  restart" >> /tmp/ss.log
10 
11     fi
12 
13     sleep 5
14 done

 

  

然后,又过了两个小时,又断网了一次。。。握草。这次要彻底排查一下问题了,根据脚本记录是在这个时间重启的。

 

那就先看一下ss的日志,找到对应时间看发生了啥。。日志是 /var/log/shadowsocks.log

 

果然是有一个错误,/dev/urandom (or equivalent) not found    导致了进程挂掉,由于我的脚本的问题,所以几秒后又启动了。开始谷歌搜这个错误。。。找了一大圈,貌似没啥解决方法,就看到了下面这个东西,感觉可能是这个问题。。。

 

 

 Too many open files 打开了太多的文件,看到这个 我想到了进程打开的文件句柄数量,那就继续排查

lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

  以打开文件句柄书排序,第一列是句柄数 第二列是进程PID

 

排行第一的21643进程打开了668个 那就看下这个进程是谁,不出意外就是ssserver 也就是ss的服务端进程

 

果然如此,是ss的进程,首先这已经是重启了之后的,我就马上开始排查问题的,就已经打开了668个了,linux进程默认打开句柄数量是1024

[root@ss ~]# ulimit -n
1024

很有可能刚才挂掉的时候,已经超过了这个值了,就导致出错了。那么 就先修改下数量,观察几个小时 看是不是真的是这个原因导致的。

修改文件句柄最大限制,我这里是centos7

vi /etc/systemd/system.conf
    DefaultLimitCORE=infinity
    DefaultLimitNOFILE=1024000
    DefaultLimitNPROC=1024000
    

重启才能生效。

 

这样应该就没啥问题了,所以来写一下记录下来,方便你我他,嘿嘿~~~ ,这种事情 不知道会不会有人遇到,要是万一碰到了呢。。。

再见~~

 

版权声明:本文为binglansky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/binglansky/p/9898098.html