[TOC]
前言
由于买的这个阿里云ECS是最低配的(2核1G内存),小落同学的后台进程经常会被莫名奇妙的杀掉,因此拟给加个看门狗保护下。
整个保护分成两部分:
1)进程检测脚本:watchdog.sh
2)将检测脚本加入crontab
具体步骤如下。
![](https://rg4.net/wp-content/uploads/2024/06/crontab.for_.xiaoluo.png)
进程检测脚本:watchdog.sh
利用一个配置文件,将小落同学绑定的端口及进程启动脚本在配置文件里配置好。然后再用一个脚本去telnet这个端口,若telnet成功,说明进程还活着,否则就是进程没了,需调用启动脚本进行启动。
配置文件
小落同学总共有两个进程,分别是backend和frontend,各使用8000端口和3000端口。
文件名:watchdog.list
8000 ./start_backend.sh localhost
3000 ./start_frontend.sh localhost
脚本内容
文件名:watchdog.sh
#!/bin/bash
Dir=`(cd $(dirname "$0");pwd)`
LogFile=$Dir/watchdog.log
while read port app ip
do
echo "===============check $ip $port"
echo -e '\x1dclose\x0d' |timeout --signal=9 5 telnet $ip $port >/dev/null 2>&1
res=$?
if [ "$res" != "0" ];then
ShellDir=`dirname $app`
echo "shell dir is $ShellDir"
flag=`cat $ShellDir/watchdog_status.conf|awk -F"=" '{print $2}'`
if [ "$flag" != "stoped" ];then
echo "$port down,flag is : $flag,restart proces!! shell: $app" >>$LogFile
echo "starting $app ..."
/bin/sh $app >/dev/null 2>&1
# source $app >/dev/null 2>&1
echo "start $app" >$ShellDir/status.conf
fi
fi
sleep 1
done < $Dir/watchdog.list
将检测脚本加入crontab
查看下当前cronjob列表。
查看命令
crontab -l
结果
7 18 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
加入小落同学相关的进程监控脚本
用crontab -e
编辑,并加入小落同学相关的进程监控脚本,并将其设置为每分钟都检测一下。
* * * * * cd /root/xiaoluo && ./watchdog.sh
查看当前back-end进程情况
lsof -i:8000
返回8000端口进程情况
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 26659 root 12u IPv4 13798102 0t0 TCP localhost:irdmi (LISTEN)
手动杀进程,看看能不能恢复?
kill -9 26659
杀进程后,等一会儿再看看进程有没有重新启来?
while true; do lsof -i:8000; sleep 1; done
其它
查看crond的日志
crond的日志默认应该是在/var/log/cron里
若是进程没启动起来的话,可以看下crond的日志,看看可能是什么原因
grep -i cron /var/log/cron
项目运行环境切换
1)conda环境切换:由于我给小落同学后台项目专门搞了一个虚拟环境,手动启动的时候都是先手动conda activate xiaoluo来切换一个环境,然后再去执行启动小落同学,但这个在crontab里写起来比较麻烦,因此将相关的环境切换移到start_backend.sh,并在这个脚本里去启动小落同学后台。
2)npm环境切换:小落同学的前台其实也是类似,小落同学的前台的npm版本也是一个比较比较老的版本(v16.14.2),启动前需要nvm use v16.14.2切换一下npm版本,相关的处理都不放到crontab里,而转移到一个专门的启动脚本:start_frontend.sh。