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

13 node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序

前言

呵呵 最近帮朋友解决问题[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) | 码农家园


完 

相关文章:

13 node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序

前言 呵呵 最近帮朋友解决问题[2022.09.08] 需要启动一个 node 程序, 然后 需要一个 startUp.sh 脚本 然后 反手写了一个过去, 按道理 来说 应该是 后台启动了对应的 node 程序, 然后将 标准输出, 错误输出 输出到 logs/nohup.log 日志文件中, 然后基于 tail 命令 来查看 …...

52癫痫发作预测的有效双自注意力残差网络

Effective dual self-attentional residual networks for epileptic seizure prediction 摘要 癫痫发作预测作为慢性脑疾病中最具挑战性的数据分析任务之一&#xff0c;引起了众多研究者的广泛关注。癫痫发作预测&#xff0c;可以在许多方面大大提高患者的生活质量&#xff0…...

【计算机网络】Tcp IP 面试题相关

互联网协议群&#xff08;TCP/IP&#xff09;&#xff1a;多路复用是怎么回事&#xff1f; 1.【问题】IPv4 和 IPv6 有什么区别&#xff1f; IPv4 是用 32 位描述 IP 地址&#xff0c;理论极限约在 40 亿 IP 地址&#xff1b; IPv6 是用 128 位描述 IP 地址&#xff0c;IPv6 可…...

【MySQL】MySQL的存储引擎

目录 概念 分类 操作 概念 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查 询、更新和删除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在 许多不同的数据库管理系统…...

es6动态模块import()

目录 一、语法说明 二、适用场合 三、注意点 四、示例代码 五、效果 一、语法说明 import命令会被 JavaScript 引擎静态分析&#xff0c;先于模块内的其他语句执行&#xff08;import命令叫做“连接” binding 其实更合适&#xff09;。 // 报错 if (x 2) {import MyMod…...

【Flask】Jinja2模板(十四)

Jinja2是一个单独的Python包&#xff0c;Flask依赖Jinja2&#xff0c;安装Flask时会自动安装Jinja2。Jinja2可以将数据和模板结合在一起生成动态文本。 一、引入 来看一个最简单的视图函数&#xff1a; app.route(/) def hello_world():return Hello World&#xff01; 这个…...

Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab

冒泡APP&#xff08;升级版&#xff09;之基于Docker部署Gitlab基于Docker安装Gitlab登录Gitlab创建Git项目上传代码使用Git命令切换Git地址使用IDE更换Git地址基于Docker安装Gitlab 查看beginor/gitlab-ce镜像版本 下载指定版本的镜像 docker pull beginor/gitlab-ce:11.3.0…...

《机器学习》基础概念之【P问题】与【NP问题】

《机器学习》基础概念之【P问题】与【NP问题】 这里写目录标题《机器学习》基础概念之【P问题】与【NP问题】一、多项式&时间复杂度1.1. 多项式1.2.时间复杂度二、P问题 & NP问题2.1. P问题2.2.NP问题2.3.举例理解NP问题-TSP旅行商推销问题三、NP-hard问题&NP-C问题…...

WinRAR安装教程

文章目录WinRAR安装教程无广告1. 下载2. 安装3. 注册4. 去广告WinRAR安装教程无广告 1. 下载 国内官网&#xff1a;https://www.winrar.com.cn/ 2. 安装 双击&#xff0c;使用默认路径&#xff1a; 点击“安装”。 点击“确定”。 点击“完成”。 3. 注册 链接&#xff…...

C++:vector和list的迭代器区别和常见迭代器失效问题

迭代器常见问题的汇总vector迭代器和list迭代器的使用vector迭代器list迭代器vector迭代器失效问题list迭代器失效问题vector和list的区别vector迭代器和list迭代器的使用 学习C&#xff0c;使用迭代器和了解迭代器失效的原因是每个初学者都需要掌握的&#xff0c;接下来我们就…...

SpringSecurity如何实现前后端分离

前后端分离模式是指由前端控制页面路由&#xff0c;后端接口也不再返回html数据&#xff0c;而是直接返回业务数据&#xff0c;数据一般是JSON格式。Spring Security默认的表单登录方式&#xff0c;在未登录或登录成功时会发起页面重定向&#xff0c;在提交登录数据时&#xff…...

为ubuntu 18.04添加蓝牙驱动

目录背景方法背景 从网上买的能直接插ubuntu 1804的usb蓝牙太少了&#xff0c;而且还贵。我就直接从JD下单的一个便宜的USB蓝牙&#xff0c;结果插上机器没有驱动起不来。我的PC是个3年前的老机器&#xff0c;实在是不想升级系统&#xff0c;于是捣鼓半天捣鼓好了&#xff0c;…...

Stable Diffusion Prompt用法

Stable Diffusion可以根据你输入的提示词&#xff08;prompt&#xff09;来绘制出想象中的画面。 1、正向提示词&#xff08;Prompt&#xff09;&#xff1a; 提高图像质量的prompt: prompt用途HDR, UHD, 64K(HDR、UHD、4K、8K和64K)这样的质量词可以带来巨大的差异提升照片…...

jenkins问题

目录 python 不是内部或外部命令&#xff0c;也不是可运行的程序 ‘cmd’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 git 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 pywintypes.com_error: (-2147024891, ‘拒绝访问。’, None,…...

阅读笔记DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks

zi,t∈Rz_{i,t}\in \mathbb{R}zi,t​∈R表示时间序列iii在ttt时刻的值。给一个连续时间段t∈[1,T]t\in [1, T]t∈[1,T]&#xff0c;将其划分为context window[1,t0)[1,t_0)[1,t0​)和prediction window[t0,T][t_0,T][t0​,T]。用context window的时间序列预测prediction window…...

01.Java的安装

1.JDK&JREJDK : Java SE Development Kit--Java开发工具JRE : Java Runtime Environment--Java运行环境Java编程&#xff0c;需要安装JDK;如果仅仅是运行一款Java程序则只需要运行JREJava的安装包分为两类&#xff1a;一类是JRE--是一个独立的Java运行环境&#xff1b; 一类…...

【C语言深度剖析】关键字(全)

文章目录一.存储类型关键字前言补充1&#xff1a;内存思考&#xff1a;补充2&#xff1a;变量与内存的关系补充3&#xff1a;变量的分类补充4&#xff1a;存储类补充5&#xff1a;删除数据是怎么删除的&#xff1f;1.auto2.register3.static4.extern基本用法:基本功能5.typedef…...

English Learning - L2 语音作业打卡 双元音 [aʊ] [əʊ] Day15 2023.3.7 周二

English Learning - L2 语音作业打卡 双元音 [aʊ] [əʊ] Day15 2023.3.7 周二&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x1f36d;【练习感受】&#x1f353;元音 /eɪ…...

记第一次面试的过程(C++)

说实话三月份上旬过得很充实&#xff0c;而且感觉蛮值&#xff0c;但还有不足的地方&#xff0c;今晚特地看完资料分析来复盘复盘。 时间还要回到3.2中午13.35&#xff08;别问我为什么那么准确&#xff0c;刚刚掏手机看的&#xff09;&#xff0c;我正在吃着饭看着王者荣耀的直…...

06 电力电子仿真 MATLAB/Simulink

文章目录01 单相半波整流电路02 单相全波整流电路&#xff08;子系统封装模块&#xff09;03 三相桥式整流电路&#xff08;三相模块与示波器使用&#xff09;04 相控与斩控交交调压&#xff08;THD计算&#xff09;05 Buck电路&#xff08;PWM实现与闭环反馈&#xff09;06 单…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...