守护进程
区分3个概念:前台进程,后台进程,守护进程
前台进程: node index.js
后台进程: node index.js &
守护进程: nohup node index.js &
前台进程和后台进程
二者的本质不同在于后台进程没有继承标准输入,因此当开启一个后台进程后,用户还可以在控制终端上输入其他命令。
后台进程继承了当前session的标准输出和标准错误,所以后台进程的所有输出仍然可以在当前session中显示
守护进程不等于后台进程。
node index.js & 产生了一个后台进程。
但这个后台进程并不是一个守护进程,因为它没有脱离终端,如果关闭终端,这个进程还是会被杀死。
守护进程
守护进程是在后台运行不受终端控制(输入,输出)的进程。一般的网络服务都是以守护进程的方式运行。
node项目常常需要用守护进程的方式启动服务,常见3种方式:nohup, forever, pm2。1
2
3nohup node index.js & // 注意:nohup不能自动把前台进程变为后台进程,必须加&
forever start index.js
pm2 start index.js
其中forever和pm2是node应用专有的启动工具,两者都能保证当进程意外退出时立即重启,但pm2提供比forever更强大的功能,包括日志收集和监控等。
sudo service xx.sh start/stop 启动/停止执行脚本
参考
[http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html]
补充
孤儿进程
父进程先退出,子进程存活,子进程将被init进程收养,成为孤儿进程。
当init进程接管了孤儿进程后,init会调用wait()来处理这些孤儿进程,从而释放它们所占用的资源。由此可见孤儿进程没有什么危害,在处理僵尸进程时可以考虑把它变为孤儿进程,进行回收。
僵尸进程
子进程死亡,但是父进程并没有及时调用 wait() 或 waitpid() 来获取死亡进程的相关信息,子进程还有一个PCB残留在进程表,就称为僵尸进程。僵尸进程仍然会消耗一定的系统资源,并且还保留了一些信息供父进程查询子进程的状态,僵尸进程会一直等待父进程读取自己的退出状态码,一旦父进程得到了子进程的返回值,僵尸进程就会结束。
如果僵尸进程过度,这些僵尸进程的PCB无法释放,将占用大量的进程描述符PID和进程表中的资源,严重的话系统运行缓慢,fork新进程时,系统将没有可用的PID来分配给新进程。
此时可以将僵尸进程的父进程直接杀死,把所有的僵尸进程都变为孤儿进程。
守护进程挂了怎么办
如果守护进程挂掉了怎么办?比如使用pm2启动服务,master进程直接挂了。
由于守护进程挂掉,那么其关联的子进程都将成为孤儿进程,同时被init进程接管。