Linux 如何查看某个端口对应的进程并kill?
线上排查端口冲突时,查进程、杀进程、防复活是三个标准动作。
- 查端口:
lsof -i :端口一把梭,比 netstat/ss 更直观。 - 一行 kill:
kill -9 $(lsof -ti :端口),查 PID 和杀进程一条命令搞定。 - 杀了又活:大概率是守护程序自动拉起,先查 systemd/supervisor/pm2。
- 根本解法:直接停掉守护服务再操作,从源头控制,不跟重启赛跑。
线上排查端口冲突时,查进程、杀进程、防复活是三个标准动作。
lsof -i :端口 一把梭,比 netstat/ss 更直观。kill -9 $(lsof -ti :端口),查 PID 和杀进程一条命令搞定。tree 把一个目录变成终端里的一棵树。日常使用记住两个参数就够了。
-L N 限制展示层级,默认无限制,深层目录直接输出爆炸。-a 控制隐藏文件可见性,默认不显示 . 开头的文件和目录。tree -L 2 -a 是覆盖大多数日常开发场景的组合。-d 只看目录骨架,跳过文件层噪音。-I 'node_modules|.git' 排除指定目录,tree 输出立刻清爽。brew install tree 一行安装。sed 是 Linux / macOS 终端下最常用的 流式文本批量处理工具,不用打开文件就能完成全局修改。
sed -i 's|原字符串|新字符串|g' 文件名,全程无交互'',否则直接报错JS 并发面试,三 道题筛掉九成候选人。
await 在 for 循环里是 串行,10 个请求 10 秒,不是 1 秒forEach 里写 await 完全无效,外层根本不会等Promise.all 一个 reject 全盘崩,要容错必须用 Promise.allSettled正解:并发用 Promise.all(arr.map(fn)),需要限流用 p-limit,要容错换 allSettled。
关键提醒:await 只暂停当前 async 函数,不会暂停外层调用者,更不会暂停 forEach 的迭代。
JS 中 async/await 不是新功能,是 Promise 的语法糖——本质还是回调。
掌握 await 只需记住 三 件事:
最佳实践:并发请求用 Promise.all,别串行 await,慢到怀疑人生。
JavaScript 异步异常处理 三 种姿势,try/catch 嵌套地狱 最常见也最糟糕。
[err, data]:Go 风格,推荐封装一个 to(promise) 工具函数,10 行代码消灭所有 try/catch,错误处理变成一行 if (err) return。
关键:业务错误用元组、致命错误仍要抛,别用工具类把所有异常都吞掉。
JavaScript 中 await 的执行顺序,是面试高频题,也是写异步代码最容易踩的坑。
await 后面的表达式 立即同步执行,只有等号左边的赋值才被推入微任务队列await 本质是 Promise.then 的语法糖,每个 await 至少消耗 一 个微任务 tickawait 串行执行,N 个请求耗时 N 倍,必须用 Promise.all 并发closest() 是 DOM 元素方法,从自身开始沿父链向上查找第一个匹配 CSS 选择器的元素。
<html>,找到即返回,否则返回 nullwhile (el && !el.matches(sel)) el = el.parentElement最佳实践:原生事件委托里只要涉及"从点击目标反查父级",优先用 closest(),别再手写 parentElement 循环。IE 不支持,老项目需 polyfill。
Preflight 是 Tailwind CSS 内置的「基础样式重置/规范化」工具,基于 modern-normalize,抹平浏览器默认样式差异,统一基线,让你只用工具类就能一致地控制布局与外观。
核心做了 5 件事:
全局 box-sizing:所有元素默认 border-box,保证 padding/border 不会撑宽元素
清空默认边距:清除 h1~h6、p、ul、blockquote 等默认 margin/padding,避免意外留白
语义化但无外观:标题不再自带大小/加粗,列表去掉项目符号,只保留语义
媒体默认 block:img、svg、video、canvas 默认 display: block,避免底部空白间隙
表单元素统一:修复 Safari 等浏览器的控件样式差异,继承字体
Linux 中有 2 种链接方式,理解它们的区别是掌握文件系统的基础:
硬链接:同一个文件,多个文件名(共用 inode),删除本体不影响其他链接
软链接(符号链接):快捷方式,存储路径指向原文件,删本体就失效