问题

最近用nodejs写了一个web端应用,但是发现一个问题,就是一段时间之后,该程序会莫名的被kill掉,很是费解,于是去网上找了下原因,大概可能是因为(Linux咱也不是特别精通,是否该问题有待验证):

Linux程序进程被杀,日志突然中止,可以考虑是否因为程序占用内存过高,导致系统内存不足,为避免系统崩溃,系统寻找内存占用最大的进程kill掉

解决方案

上面的原因是针对所有nohup启动的,所以如果只是为了解决node.js的问题,是可以引入node.js的守护程序的,比如:pm2,或者应用程序使用egg.js,它使用了自研的egg-cluster实现了进程守护,地址详见:Egg.js 进程管理为什么没有选型 PM2 ?

当然,因为项目本身属于演示类项目,所以我们没有采用上述方案,而是使用了更简洁的方案,通过定时任务及sehll脚本来做进程守护。

shell脚本

思路就是,查找端口以及应用名,将进程id找到,然后进行判断,找到了则不做操作,没找到则重新启动应用,下面是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

pid1=`netstat -nap | grep 3000 | grep node | sed 's/\// /g' | awk '{print $7}'`

if [ -z "$pid1" ]

then

echo "can not find the pid of community server, and will be restart it" >> /var/log/messages

cd /root/MicroCommunityWeb/ && nohup node ./bin/www &

exit 0

fi

echo "find the pid of community server" >> /var/log/messages

echo 1

上面的脚本,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