问题
最近用nodejs写了一个web端应用,但是发现一个问题,就是一段时间之后,该程序会莫名的被kill掉,很是费解,于是去网上找了下原因,大概可能是因为(Linux咱也不是特别精通,是否该问题有待验证):
Linux程序进程被杀,日志突然中止,可以考虑是否因为程序占用内存过高,导致系统内存不足,为避免系统崩溃,系统寻找内存占用最大的进程kill掉
解决方案
上面的原因是针对所有nohup启动的,所以如果只是为了解决node.js的问题,是可以引入node.js的守护程序的,比如:pm2
,或者应用程序使用egg.js,它使用了自研的egg-cluster
实现了进程守护,地址详见:Egg.js 进程管理为什么没有选型 PM2 ?
当然,因为项目本身属于演示类项目,所以我们没有采用上述方案,而是使用了更简洁的方案,通过定时任务及sehll脚本来做进程守护。
shell脚本
思路就是,查找端口以及应用名,将进程id找到,然后进行判断,找到了则不做操作,没找到则重新启动应用,下面是代码:
1 | !/bin/bash |
上面的脚本,node我没有放到环境变量中,所以报错了,如果你遇到同样的问题,也可以使用
/usr/local/bin/node ./bin/www
定时任务
使用crontab -e
增加一条定时任务:*/1 * * * * /home/daemon/community-server-start.sh >/home/daemon/community-server-start.log 2>&1
,一分钟执行一次检查。
下面是定时任务的一些例子,方便理解定时任务的写法:
每1分钟执行一次myCommand:
* * * * * myCommand
每小时的第3和第15分钟执行:
3,15 * * * * myCommand
在上午8点到11点的第3和第15分钟执行:
3,15 8-11 * * * myCommand
每隔两天的上午8点到11点的第3和第15分钟执行:
3,15 8-11 */2 * * myCommand
每周一上午8点到11点的第3和第15分钟执行:
3,15 8-11 * * 1 myCommand
每晚的21:30重启smb:
30 21 * * * /etc/init.d/smb restart
每月1、10、22日的4 : 45重启smb:
45 4 1,10,22 * * /etc/init.d/smb restart
每周六、周日的1 : 10重启smb:
10 1 * * 6,0 /etc/init.d/smb restart
每天18 : 00至23 : 00之间每隔30分钟重启smb:
0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11 : 00 pm重启smb:
0 23 * * 6 /etc/init.d/smb restart
每一小时重启smb:
0 */1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb:
0 23-7/1 * * * /etc/init.d/smb restart