当前位置: 首页 > news >正文

网站精品案例安徽网络推广

网站精品案例,安徽网络推广,linode wordpress建站,疫情防控最新政策图片前言 呵呵 最近帮朋友解决问题[2022.09.08] 需要启动一个 node 程序, 然后 需要一个 startUp.sh 脚本 然后 反手写了一个过去, 按道理 来说 应该是 后台启动了对应的 node 程序, 然后将 标准输出, 错误输出 输出到 logs/nohup.log 日志文件中, 然后基于 tail 命令 来查看 …

前言

呵呵 最近帮朋友解决问题[2022.09.08] 

需要启动一个 node 程序, 然后 需要一个 startUp.sh 脚本 

然后 反手写了一个过去, 按道理 来说 应该是 后台启动了对应的 node 程序, 然后将 标准输出, 错误输出 输出到 logs/nohup.log 日志文件中, 然后基于 tail 命令 来查看 logs/nohup.log 的日志 

但是 问题是 我中断了 tail 命令之后, startUp.sh 中启动的 node 程序 也被中断了?? 

按之前的经验, 这个 node 程序应该不会被中断才对, 但是 这个挺出乎我的意料的, 因此 当时记录了一个 todo 

这里主要是 两个参照, 一个是 启动 node 程序, 另外一个是 启动一个普通的 java 程序, 然后 来作为对比 

然后 这里来看一下, 当然 依然 还是存在很多 不明白的地方  

以下 node 部分代码参考自 关于node.js:Nodejs-进程在退出时挂起(Ctrl + C) | 码农家园

测试用例

编写一个 node 程序 如下 


console.log('PID: ', process.pid);var http = require('http'); // HTTP server to keep the script up long enough
http.createServer(function (req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World\n');
}).listen(1337, '127.0.0.1');console.log('Server running at http://127.0.0.1:1337/');

新建一个 nodeStartUp.sh 如下

nohup node nodeProcess.js > ./logs/nodeNohup.log 2>&1 &tail -f ./logs/nodeNohup.log

执行 nodeStartUp.sh 程序正常启动, 并打印 相关日志 

master:11_singal2Parent jerry$ ./nodeStartUp.sh 
PID:  3612
Server running at http://127.0.0.1:1337/

访问服务, 拿到正确的结果  

问题复现效果如下 

master:11_singal2Parent jerry$ ps -ef | grep node501  3612  3611   0  9:56PM ttys000    0:00.17 node nodeProcess.js501  3613  3611   0  9:56PM ttys000    0:00.00 tail -f ./logs/nodeNohup.log501  3635   515   0  9:59PM ttys001    0:00.00 grep node// 中断 tail -f 之后, 发现 node 进程也挂了 
master:11_singal2Parent jerry$ ps -ef | grep node501  3638   515   0  9:59PM ttys001    0:00.00 grep node

参照的 java 程序

注册了各个 SignalHandler, 主要是因为 怀疑这个 node 进程的挂掉可能和进程之间的 信号机制 有关系 

/*** Test07Signal2ParentProcess** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2022-09-10 19:18*/
public class Test07Signal2ParentProcess {// Test07Signal2ParentProcesspublic static void main(String[] args) throws Exception {String lines = "HUP\n" +"INT\n" +
//                "QUIT\n" +
//                "ILL\n" +"TRAP\n" +"ABRT\n" +"EMT\n" +
//                "FPE\n" +
//                "KILL\n" +"BUS\n" +
//                "SEGV\n" +"SYS\n" +"PIPE\n" +"ALRM\n" +"TERM\n" +"URG\n" +
//                "STOP\n" +"TSTP\n" +"CONT\n" +"CHLD\n" +"TTIN\n" +"TTOU\n" +"IO\n" +"XCPU\n" +"XFSZ\n" +"VTALRM\n" +"PROF\n" +"WINCH\n" +"INFO\n" +
//                "USR1\n" +"USR2";for (String sigNo : lines.split("\n")) {Signal.handle(new Signal(sigNo), new SignalHandler() {@Overridepublic void handle(Signal signal) {System.out.println(sigNo);}});}Signal.raise(new Signal("ALRM"));Signal.raise(new Signal("INT"));Thread.sleep(300 * 1000);}}

模拟 nodeStartUp.sh 同样编写一个 startUp.sh 

java -classpath /Users/jerry/IdeaProjects/HelloWorld/target/classes com.hx.test13.Test07Signal2ParentProcess > ./logs/nohup.log 2>&1 &tail -f ./logs/nohup.log

startUp.sh 启动程序之后, 输出如下 

master:11_singal2Parent jerry$ ./startUp.sh 
ALRM

关于进程结构 

node 进程的进程结构 

491     1   0  9:51AM ??         2:44.93 /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal492   491   0  9:51AM ttys000    0:00.03 login -pf jerry// shell493   492   0  9:51AM ttys000    0:00.80 -bash// startUp.sh3651   493   0 10:01PM ttys000    0:00.00 -bash3652  3651   0 10:01PM ttys000    0:00.14 node nodeProcess.js3653  3651   0 10:01PM ttys000    0:00.00 tail -f ./logs/nodeNohup.log

参照的 java 程序的进程结构 

491     1   0  9:51AM ??         2:52.94 /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal527   491   0  9:52AM ttys002    0:00.02 login -pf jerry// shell528   527   0  9:52AM ttys002    0:00.19 -bash// startUp.sh 3708   528   0 10:07PM ttys002    0:00.00 -bash3709  3708   0 10:07PM ttys002    0:00.11 /usr/bin/java -classpath /Users/jerry/IdeaProjects/HelloWorld/target/classes com.hx.test13.Test07Signal2ParentProcess3710  3708   0 10:07PM ttys002    0:00.00 tail -f ./logs/nohup.log

按正常情况来看, 因为 启动 node/java 程序是后台执行的 

正产情况应该是 ctrl + c 中止 "tail -f" 了之后, startUp.sh 脚本执行完成退出, 但是 node/java 程序还在才对, 但是 node 程序缺退出了, 而 java 程序没有退出  

从 node 退出的现象来看, 像是 "tail -f" 的进程接收到了 ctrl + c, 之后发送了信息到 node 进程, 或者 "tail -f" 进程接收到了 ctrl + c, 之后发送了信息到 "startUp.sh" 进程, 然后 "startUp.sh" 进程再发送了信息到 node 进程, 来中止了 node 进程 ?

测试 node 进程

信号交互 是一种进程之间通信的方式, 这里也是我们 首先怀疑的交互方式 

ctrl + c 发送的是中断信号, 对应于信号变量 SIGINT 

在 nodeProcess.js 最前面注册 中断信号的处理, ALRM 信号的处理, 主要是输出一下 中断信号处理的处理函数 

process.on('SIGINT', function() {console.log('SIGINT');process.exit();
});process.on('SIGALRM', function() {console.log('Nice SIGINT-handler');var listeners = process.listeners('SIGINT');console.log(" lisetner size : " + listeners.length);for (var i = 0; i < listeners.length; i++) {console.log(listeners[i].toString());}//    process.exit();
});console.log('PID: ', process.pid);var http = require('http'); // HTTP server to keep the script up long enough
http.createServer(function (req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World\
');
}).listen(1337, '127.0.0.1');console.log('Server running at http://127.0.0.1:1337/');

然后开始测试, 可以看到的是 ctrl + c 的时候, 确实有程序向 node 进程发送了 SIGINT 的信号 

但是是 哪一个进程呢?, 为什么要发送呢 ?, 对应于 参照的 java 进程又会是怎样的情况呢?

^Cmaster:11_singal2Parent jerry$ ./nodeStartUp.sh 
PID:  3799
Server running at http://127.0.0.1:1337/
^Cmaster:11_singal2Parent jerry$ cat logs/nodeNohup.log 
PID:  3799
Server running at http://127.0.0.1:1337/
SIGINT
master:11_singal2Parent jerry$ 

测试 java 进程

使用 startUp.sh 启动, 并 ctrl + c 中断 "tail -f" 

可以发现 java 进程这边并没有收到 SIGINT 的信号 

这是怎么回事?? 

master:11_singal2Parent jerry$ ./startUp.sh 
ALRM
^Cmaster:11_singal2Parent jerry$ cat logs/nohup.log 
ALRM

向 java 进程发送信号, 其他的大部分信号均能够使用 代码注册的 handler

但是 SIGINT 似乎是不行 

# cmd 中发送命令给 java 程序
master:11_singal2Parent jerry$ kill -20 3872
master:11_singal2Parent jerry$ kill -20 3872
master:11_singal2Parent jerry$ kill -28 3872
master:11_singal2Parent jerry$ kill -13 3872
master:11_singal2Parent jerry$ kill -22 3872
master:11_singal2Parent jerry$ kill -2 3872
master:11_singal2Parent jerry$ kill -2 3872
master:11_singal2Parent jerry$ kill -2 3872
master:11_singal2Parent jerry$ kill -2 3872# 日志文件中展示日志如下 
master:11_singal2Parent jerry$ cat logs/nohup.log
ALRM
CHLD
CHLD
WINCH
PIPE
TTOU
# 在 startUp.sh 中启动的 java 进程, 似乎对于 SIGINT 的处理有其他的转换, 没有走 handler, 但是也没有走默认的处理 

在 idea 中输出如下 

# cmd 中发送命令给 java 程序
master:11_singal2Parent jerry$ kill -20 3926
master:11_singal2Parent jerry$ kill -20 3926
master:11_singal2Parent jerry$ kill -28 3926
master:11_singal2Parent jerry$ kill -13 3926
master:11_singal2Parent jerry$ kill -22 3926
master:11_singal2Parent jerry$ kill -2 3926
master:11_singal2Parent jerry$ kill -2 3926
master:11_singal2Parent jerry$ kill -2 3926# idea 中显示的日志
ALRM
CHLD
CHLD
WINCH
PIPE
TTOU
INT
INT
INT# 当点击了 idea 的停止按钮, 发送了一个 SIGINT 给进程, idea 关闭了 jpda 客户端, 停止按钮变成了骷髅头
Disconnected from the target VM, address: '127.0.0.1:54296', transport: 'socket'
INT
# 再次点击 idea 的停止按钮, 发送了一个 SIGKILL 给进程, 强制杀掉进程 
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

假设我们去掉 java 程序中的 SIGINT 的手动注册的 handler, 使用系统默认的处理 

 在 cmd 中使用 startUp.sh 效果如下 

# cmd 中发送命令给 java 程序
master:11_singal2Parent jerry$ kill -20 3897
master:11_singal2Parent jerry$ kill -20 3897
master:11_singal2Parent jerry$ kill -28 3897
master:11_singal2Parent jerry$ kill -13 3897
master:11_singal2Parent jerry$ kill -22 3897
master:11_singal2Parent jerry$ kill -2 3897
master:11_singal2Parent jerry$ kill -2 3897
master:11_singal2Parent jerry$ kill -2 3897# 日志文件中展示日志如下 
master:11_singal2Parent jerry$ cat logs/nohup.log 
ALRM
CHLD
CHLD
WINCH
PIPE
TTOU
# 在 startUp.sh 中启动的 java 进程, 似乎对于 SIGINT 的处理有其他的转换, 没有走 handler, 但是也没有走默认的处理 

在 idea 中输出如下 

# cmd 中发送命令给 java 程序
master:11_singal2Parent jerry$ kill -20 3893
master:11_singal2Parent jerry$ kill -20 3893
master:11_singal2Parent jerry$ kill -28 3893
master:11_singal2Parent jerry$ kill -13 3893
master:11_singal2Parent jerry$ kill -22 3893
master:11_singal2Parent jerry$ kill -2 3893
master:11_singal2Parent jerry$ kill -2 3893
-bash: kill: (3893) - No such process# idea 中显示的日志
ALRM
CHLD
CHLD
WINCH
PIPE
TTOU# 当点击了 idea 的停止按钮, 发送了一个 SIGINT 给进程, idea 关闭了目标进程, SIGINT 的默认处理是终止进程 
Disconnected from the target VM, address: '127.0.0.1:53095', transport: 'socket'Process finished with exit code 130 (interrupted by signal 2: SIGINT)

怎么解决 node 中这个问题?

很简单, 只需要注册一下 SIGINT 的自定义处理函数, 不要调用关闭进程的相关处理即可 

process.on('SIGINT', function() {console.log('SIGINT');
//    process.exit();
});

演示如下, 可以发现 ctrl + c 之后, node 进程依然还在 

master:11_singal2Parent jerry$ ps -ef | grep node501  3957   493   0 10:48PM ttys000    0:00.00 grep node
master:11_singal2Parent jerry$ ./nodeStartUp.sh 
PID:  3959
Server running at http://127.0.0.1:1337/
^Cmaster:11_singal2Parent jerry$ ps -ef | grep node501  3959     1   0 10:48PM ttys000    0:00.04 node nodeProcess.js501  3962   493   0 10:48PM ttys000    0:00.00 grep node
master:11_singal2Parent jerry$ cat logs/nodeNohup.log 
PID:  3959
Server running at http://127.0.0.1:1337/
SIGINT
master:11_singal2Parent jerry$ 

遗留的问题?

呵呵 一些 还在知识盲区的问题 

1. 但是是 哪一个进程呢 向 node进程 发送的 SIGINT ?

2. 这个进程 为什么要发送 SIGINT 到 node 进程呢 ?

3. java 程序这边通过 "startUp.sh" 启动, 进程到底收到 SIGINT 没有? 

4. java 程序这边程序中注册的 SIGINT 的 handler 为什么没有生效?, 替换成了什么?

希望 后面能够解释的清楚以上的这些问题 

参考 

关于node.js:Nodejs-进程在退出时挂起(Ctrl + C) | 码农家园


完 

http://www.hkea.cn/news/45759/

相关文章:

  • 网站建设丿选择金手指15凡科建站官网
  • 可以做外国网站文章武汉企业seo推广
  • 天津网站建设公司最好太原做网站哪家好
  • 网站代下单怎么做百度指数数据分析平台入口
  • 淘宝做动效代码的网站seo的优化方向
  • 番禺建网站公司网站搜索工具
  • 安徽万振建设集团网站长春网站推广公司
  • 网站怎么制作 推广seo超级外链工具免费
  • 中小学网站建设探讨东莞seo整站优化火速
  • php是网站开发的语言吗企业网站的作用
  • 网站站外优化怎么做企业推广app
  • 拉趣网站是谁做的威海网站制作
  • 做宣传海报的网站百度导航2023年最新版
  • 湖南做网站 磐石网络windows优化大师官方免费
  • 制作网站的最新软件如何优化关键词的方法
  • 东莞工作招聘网最新招聘搜索 引擎优化
  • 宁波俄语网站建设免费发广告的平台有哪些
  • 郑州外贸网站建设及维护营销软件商城
  • 泉州百度关键词排名广州网站营销优化qq
  • 怎么做wep网站营销推广活动方案
  • 展示型网站php官方app下载安装
  • 嘉祥网站建设广东省自然资源厅
  • 忘记网站后台密码网站排名软件推荐
  • 怎么查公司网站有没有被收录火爆产品的推广文案
  • 绵阳网站建设 经开区网络教学平台
  • wordpress阅读量没改7个湖北seo网站推广策略
  • 网站建设成功案例方案找培训机构的平台
  • 园林绿化网站建设百度关键词优化公司
  • 个人如何建设网站网络营销方式有哪些分类
  • 北京做百度网站建设电商平台如何推广运营