shell脚本:定时干死进程并重启
这是记录我写的第一个shell脚本。
一、写此脚本的原因:最近服务器发生了一次崩溃,已经无法连接到服务器。
后来了解到出现这种情况,主要是因为进程跑满了,memory被消耗光了,无法为其进行操作,包括vnc操作命令和SSH连接分配内存。
有一些解决方法:
- 重启服务器。
- 修改最大进程数后系统恢复。
echo 1000000 > /proc/sys/kernel/pid_max:修改pid_max值为1000000 echo
"kernel.pid_max=1000000 " >> /etc/sysctl.confsysctl -p:设置永久生效
二、分析并解决的方法
- 我并没有选上述的解决方法,但是已经出现cannot allocate memory这种情况只能是重启服务器了。
- 为了避免这种情况(无法连接或执行指令导致项目功能不能正常使用)的发生,我选择对那些持续运行的多线程复杂项目进行定时的释放资源。写了如下脚本,提供参考。
执行命令:
1、chmod +x restart-bida-macd-datasource-huobi.sh
2、nohup ./restart-bida-macd-datasource-huobi.sh > sh.out &
附:bash代码块
#!/bin/bash
while true; do
sleep `expr 6 \* 60 \* 60`
date=`date "+%Y-%m-%d %H:%M:%S"`
pid=`ps -ef | grep "bida-macd-datasource-huobi.jar" | grep -v "grep" | awk '{print $2}'`
if [ -z "$pid" ]; then
echo "$date pid does not exist!"
else
echo "$date pid:$pid is running!"
kill -9 $pid
> nohup.out
nohup java -jar -XX:+UseConcMarkSweepGC bida-macd-datasource-huobi.jar > nohup.out &
fi
pidMax=`sysctl kernel.pid_max`
pidNum=`ps -eLf|wc -l`
echo "$pidMax pidsNum:$pidNum"
done