Skip to content

JS 全栈开发者的 Linux 实战手册

更新: 6/28/2026 字数: 0 字 时长: 0 分钟

不是 Linux 教科书,不讲文件系统原理、不背冷门参数。只讲一件事:你作为 JS 全栈,登上服务器部署 Node、查日志、传构建包时,到底要敲哪些命令。

一、开篇:你为什么绕不开 Linux

JS 全栈为什么要学 Linux

你本地在 Mac 或 Windows 上写得飞起,但代码一旦要上线——几乎所有线上服务器都是 Linux。你 SSH 上去,没有图形界面,只有一个黑窗口,所有操作都靠命令。这时候不会 Linux,你就只能干等运维,连"服务为什么挂了"都查不了。

对 JS 全栈来说,Linux 不需要学全。你的真实场景就这么几类:登服务器、传构建包、装依赖跑 Node、查日志定位 bug、管进程和端口、偶尔看看磁盘内存够不够。这份手册就按"每日必用 → 每周常用 → 应急使用"的优先级,把这些场景对应的命令讲透,其余的一律不碰。

一个前提:连服务器用 ssh 用户名@服务器IP,这是一切的起点。例如 ssh root@192.168.1.100,输密码或配好密钥即可登入。

二、【每日必用】目录导航与文件操作

每日必用:目录导航与文件操作

登上服务器第一件事,就是找到你的项目目录。这几个命令你每天敲几十次。

bash
pwd                      # 我现在在哪个目录(print working directory)
ls                       # 列出当前目录文件
ls -lah                  # 常用!l=详情 a=含隐藏文件 h=人类可读的大小
cd /var/www/myapp        # 进入项目目录
cd ..                    # 回上一级
cd ~                     # 回到当前用户的家目录
cd -                     # 回到上一次所在的目录

文件和目录的增删改查:

bash
mkdir -p logs/2026       # 创建目录,-p 连不存在的父目录一起建
touch app.log            # 创建空文件
cp config.js config.bak.js        # 复制(备份配置常用)
cp -r dist /var/www/html          # 复制目录要加 -r
mv old-name.js new-name.js        # 重命名 / 移动
rm app.log               # 删文件
rm -rf node_modules      # 删目录(危险,见下方踩坑)
cat package.json         # 直接打印文件全部内容

典型场景:登上服务器,cd /var/www/myapp 进项目,ls -lah 看看构建包在不在、cat package.json 确认版本对不对。

⚠️ 踩坑(必记)rm -rf 是 Linux 头号杀器,删除不进回收站、不可恢复。绝对不要在不确定路径时执行 rm -rf,尤其是 rm -rf / 或变量没取到值时的 rm -rf $DIR/(如果 $DIR 为空就成了删根目录)。删之前先用 ls 确认路径。

🔄 Windows 差异

  • Linux 路径用正斜杠 /,Windows 用反斜杠 \
  • Linux 严格区分大小写App.jsapp.js 是两个文件!这是前端在本地(Mac 不敏感)好好的、一传到 Linux 就 Module not found 的最常见原因——import 的路径大小写和真实文件名对不上。

三、【每日必用】处理日志:查看与搜索

处理日志:查看与搜索

线上服务报错,你 80% 的时间在跟日志打交道。这几个命令是你的排错主力。

bash
# 实时滚动看最新日志(最常用!部署后盯着看启动有没有报错)
tail -f app.log
tail -n 100 app.log      # 看最后 100 行

# 在日志里搜关键词
grep "ERROR" app.log              # 找所有含 ERROR 的行
grep -i "error" app.log           # -i 忽略大小写
grep -n "TypeError" app.log       # -n 显示行号
grep -C 5 "ERROR" app.log         # 显示匹配行的上下各 5 行(看上下文)

# 组合拳:实时监控日志里的错误
tail -f app.log | grep -i "error"

# 翻页看大日志文件(按 q 退出,/ 搜索)
less app.log

典型场景

  • 部署完 Node 服务,tail -f 盯着日志看启动有没有刷错误。
  • 用户报"接口 500",grep -n -C 5 "ERROR" app.log 定位报错堆栈和上下文。
  • 日志太大几个 G,别用 cat(会刷屏卡死),用 lesstail

踩坑:直接 cat 一个上 G 的日志文件会瞬间刷屏、甚至卡住终端。大文件一律用 tail / less / grep

四、【每日必用】Node 进程与端口管理

Node 进程与端口管理

"端口被占用""服务卡死要重启"是 Node 全栈的日常,这几个命令救命。

bash
# 查 Node 进程
ps aux | grep node          # 列出所有 node 相关进程,拿到 PID(进程号)

# 查端口被谁占用(部署最高频问题:EADDRINUSE 端口已被占用)
lsof -i:3000                # 看 3000 端口被哪个进程占了
netstat -tlnp | grep 3000   # 同样能看端口占用(部分系统用 ss -tlnp)

# 结束进程
kill 12345                  # 优雅结束 PID 为 12345 的进程
kill -9 12345               # 强制杀死(卡死了才用,-9 不给进程清理机会)

# 跑 Node 服务(生产别用 node app.js 裸跑,进程一断服务就没了)
nohup node app.js > app.log 2>&1 &   # 后台运行并把日志写入文件

生产环境强烈建议用进程管理器 PM2,比裸跑稳得多:

bash
npm install -g pm2
pm2 start app.js --name myapp   # 启动并命名
pm2 list                         # 看所有进程状态
pm2 logs myapp                   # 看日志
pm2 restart myapp                # 重启
pm2 stop myapp                   # 停止
pm2 startup && pm2 save          # 配置开机自启

典型场景:部署时报 Error: listen EADDRINUSE :::3000,说明 3000 端口被占。用 lsof -i:3000 查出 PID,kill -9 PID 杀掉,再重启服务。

踩坑:直接 node app.js 启动,一旦你关掉 SSH 终端,进程就跟着没了。务必用 pm2nohup ... & 让它在后台常驻。

五、【每周常用】传输构建包与权限管理

每周常用:传输构建包与权限管理

发版时把本地 dist 传上服务器、给脚本加执行权限,这类事一周总要干几回。

传文件(scp / rsync)

bash
# 把本地 dist 目录传到服务器(在本地终端执行)
scp -r ./dist root@192.168.1.100:/var/www/html/

# 从服务器下载文件到本地
scp root@192.168.1.100:/var/log/app.log ./

# rsync 更高效(只传有变化的部分,大项目首选)
rsync -avz --delete ./dist/ root@192.168.1.100:/var/www/html/

压缩与解压(传包前先打包更快)

bash
tar -czvf dist.tar.gz dist/      # 打包压缩:c建 z用gzip v显示 f文件名
tar -xzvf dist.tar.gz            # 解压
# 典型流程:本地 tar 打包 → scp 上传 → 服务器 tar 解压

权限管理(chmod / chown)

bash
chmod +x deploy.sh        # 给脚本加可执行权限(不加会 Permission denied)
chmod 755 deploy.sh       # 常见权限:所有者可读写执行,其他人可读执行
chown -R www:www /var/www/html   # 改文件归属者(-R 递归)

权限数字速记:r=4 w=2 x=1,相加即可。755 = 7(4+2+1) + 5(4+1) + 5(4+1),644 是普通文件常见权限。

典型场景:CI 没接好时手动发版——本地 npm run buildtar 打包 → scp 上传 → 服务器解压到 Nginx 目录。脚本传上去跑不动,多半是没 chmod +x

Windows 差异:Windows 没有这套 rwx 权限模型。前端在 Windows 写的 .sh 脚本传到 Linux 上,常因为没有执行权限换行符是 CRLF而报错(见最后一节)。

六、【应急使用】服务器"体检":磁盘、内存、负载

应急指令:服务器体检怎么查

这些命令平时用不上,但当服务突然变慢、构建失败、服务器告警时,靠它们快速定位。

bash
# 磁盘空间(构建失败常因磁盘满了!npm/打包需要空间)
df -h                    # 看各分区使用率,重点看 Use% 是不是 100%
du -sh ./*               # 看当前目录下各文件夹占了多大(找谁占了空间)
du -sh node_modules      # 看 node_modules 多大

# 内存(Node 构建/运行内存不够会被系统杀掉)
free -h                  # 看内存使用情况

# CPU 与整体负载(服务变慢时看是不是某进程吃满 CPU)
top                      # 实时进程监控,按 q 退出(按 M 按内存排序)
htop                     # 更友好的版本(需安装)

# 系统信息
uname -a                 # 看系统内核信息

典型场景

  • npm install 或打包突然失败报奇怪错误 → df -h 看是不是磁盘满了(清日志、清旧的 node_modules)。
  • 服务卡顿 → top 看是不是某个 Node 进程 CPU 飙到 100%,或内存被占满。
  • 服务器告警磁盘满 → du -sh /var/log/* 找出最占空间的日志文件清理。

踩坑:JS 项目的 node_modules 和日志是磁盘杀手。线上磁盘满了导致服务异常,十有八九是它俩。du -sh 快速揪出元凶。

七、【应急使用】其他救急命令

低频但关键,混个眼熟,需要时能想起来查:

bash
# 环境变量(Node 读 process.env 全靠它)
echo $NODE_ENV           # 查看某个环境变量
export NODE_ENV=production   # 临时设置(仅当前会话有效)

# 网络连通性排查(接口调不通时)
ping api.example.com         # 测网络是否通
curl http://localhost:3000/health   # 直接在服务器上测接口返回
curl -I https://example.com  # 只看响应头(查状态码、CDN缓存)

# 找文件 / 找命令位置
find . -name "*.log"         # 在当前目录递归找所有 .log 文件
which node                   # 看 node 装在哪、用的是哪个版本路径
node -v && npm -v            # 确认版本(线上版本不对是经典事故)

# 看历史命令
history | grep pm2           # 翻自己敲过的命令

典型场景:接口在本地好好的、线上调不通 → 在服务器上 curl http://localhost:3000/xxx 直接测,区分是"服务本身挂了"还是"Nginx/网络问题"。

八、JS 全栈踩坑总清单 + Windows 差异

JS 全栈用 Linux 的踩坑点与 Windows 差异

把全文的坑汇总,这张表建议存下来对照:

坑点现象解决 / 说明
大小写敏感本地(Mac/Win)跑得好,上 Linux 报 Module not foundLinux 区分大小写,检查 import 路径和真实文件名大小写是否完全一致
换行符 CRLF/LF.sh 脚本在 Linux 报 bad interpreter / ^M 错误Windows 是 CRLF,Linux 是 LF。用 dos2unix script.sh 转换,或在 Git 配 core.autocrlf
脚本没执行权限Permission deniedchmod +x script.sh
路径分隔符硬编码 \ 的路径在 Linux 失效代码里用 path.join() 而非手拼,别写死 \
rm -rf 误删文件不可恢复删前先 ls 确认路径,警惕变量为空的情况
裸跑 node关掉 SSH 服务就停了pm2nohup ... &
端口占用 EADDRINUSE启动报端口已被占lsof -i:端口 查 PID,kill -9 后重启
磁盘满导致构建失败npm/build 报莫名错误df -h 查磁盘,清理日志和旧依赖
环境变量没生效process.env.XXX 是 undefinedexport 仅当前会话有效,持久化要写进 .bashrc 或用 .env + dotenv
sudo 权限装全局包/改系统目录报权限错必要时加 sudo,但别滥用,能不用 root 就别用

几条 Windows 用户的额外提醒

  • 在 Windows 上开发,强烈建议装 WSL2(Windows Subsystem for Linux),直接在 Windows 里跑一个真 Linux 环境,本地就能用上所有这些命令,和线上环境一致,能避开一大半"本地能跑线上挂"的问题。
  • 终端推荐用 Windows Terminal + WSL,比 CMD/PowerShell 体验好太多。

学习优先级总结

不用一次背完,按这个节奏练:

  1. 第一周,把"每日必用"练成肌肉记忆cd / ls / cat / tail / grep / ps / kill / lsof,能独立登服务器查日志、管进程;
  2. 第二周,掌握"每周常用"scp / tar / chmod,能自己手动发一次版;
  3. 之后遇到再查"应急命令"df / top / free / curl,告警时不慌;
  4. 进阶:装 pm2 管 Node 进程、Windows 用户上 WSL2,让本地环境贴近线上。