egg服务的重启,这里使用到了child_process插件。
安装插件:npm install child_process --save
使用插件:
const callfile = require('child_process');
callfile.spawn(脚本路径, [ '-P', port, '-W', workPath ], { cwd: workPath, stdio: 'ignore', detached: true }, function(error, stdout, stderr) {
if (error) {
console.error('error: ' + error);
return;
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
}).unref();
说明:
第一个参数为脚本的路径可以是相对路径,也可以是绝对路径
第二个参数为脚本参数,这里用到了egg服务的端口和脚本的工作路径
第三个参数为本次子进程所带的参数
第四个参数为回调函数
调用callfile.spawn().unref(),将子进程从父进程的事件循环中剔除,于是父进程可以愉快的退出;
设置shell脚本的工作路径cwd: 脚本工作路径
设置detached为true,准备子进程独立于其父进程运行;
设置 stdio: ‘ignore’,忽略输出,因为默认情况下,在父 Node.js 进程和衍生的子进程之间会建立管道,这些管道具有有限的容量,如果子进程在没有捕获输出的情况下写入超出了该限制,则子进程将阻塞等待管道缓冲区接受更多的数据。
缺一不可。
开发环境脚本
#!/bin/bash
PORT=""
WORKPATH=""
while getopts ":P:W:" arg
do
case $arg in
P)
PORT=$OPTARG
;;
W)
WORKPATH=$OPTARG
;;
?)
echo "含有未知参数"
exit 1;;
esac
done
# kill $(lsof -i:$PORT) #优雅退出,但是会将访问该端口的浏览器也Kill
fuser -k -n tcp $PORT #暴力退出
sleep 3
cd $WORKPATH
nohup npm run dev &
生产环境脚本
#!/bin/bash
PORT=""
WORKPATH=""
while getopts ":P:W:" arg
do
case $arg in
P)
PORT=$OPTARG
;;
W)
WORKPATH=$OPTARG
;;
?)
echo "含有未知参数"
exit 1;;
esac
done
# npm stop 使用这个退出有问题
# kill $(lsof -i:$PORT) #优雅退出,但是会将访问该端口的浏览器也Kill
fuser -k -n tcp $PORT #暴力退出
sleep 10
cd $WORKPATH
npm start