| 
					
				 | 
			
			
				@ -1,22 +1,25 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    服务守护脚本。当服务器进程失败时,重启IM服务器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    守护服务不是应用程序的入口,但作为服务的外壳,提供进程信号监听与进程重启,保证服务的连续性。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 服务守护脚本。当服务器进程失败时,重启IM服务器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 守护服务不是应用程序的入口,但作为服务的外壳,提供进程信号监听与进程重启,保证服务的连续性。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				var cp = require('child_process'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				var worker; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				"use strict"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				function spawn(spawnScript) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 进程守护,开启IPC通道,双向通信 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    worker = cp.spawn('node', [spawnScript], { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        stdio: [0, 1, 2, 'ipc'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let cp = require('child_process'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let worker; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				require('util'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				function startWorker(spawnScript) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 进程守护,开启IPC通道双向通信 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    let exeFile = process.platform === "linux" ? "./node" : "node"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    worker = cp.spawn(exeFile, [spawnScript], {stdio: [0, 1, 2, 'ipc']}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //监视子进程,当其崩溃时重启服务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    worker.on('exit', function (code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (code !== 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            console.log('IM server is down, restarting...'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            spawn(spawnScript); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            startWorker(spawnScript); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -26,7 +29,9 @@ function spawn(spawnScript) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				function main() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    spawn('./app.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    console.log('Armour process id: ' + process.pid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    startWorker('./app.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 守护进程本身退出时,关闭其启动的服务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    process.on('SIGTERM', function () { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -35,4 +40,5 @@ function main() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				main(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				main(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 |