Appearance
JS 全栈开发者的 Linux 实战手册
更新: 6/28/2026 字数: 0 字 时长: 0 分钟
不是 Linux 教科书,不讲文件系统原理、不背冷门参数。只讲一件事:你作为 JS 全栈,登上服务器部署 Node、查日志、传构建包时,到底要敲哪些命令。
一、开篇:你为什么绕不开 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.js和app.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(会刷屏卡死),用less或tail。
踩坑:直接
cat一个上 G 的日志文件会瞬间刷屏、甚至卡住终端。大文件一律用tail/less/grep。
四、【每日必用】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 终端,进程就跟着没了。务必用pm2或nohup ... &让它在后台常驻。
五、【每周常用】传输构建包与权限管理

发版时把本地 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 build → tar 打包 → 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 差异

把全文的坑汇总,这张表建议存下来对照:
| 坑点 | 现象 | 解决 / 说明 |
|---|---|---|
| 大小写敏感 | 本地(Mac/Win)跑得好,上 Linux 报 Module not found | Linux 区分大小写,检查 import 路径和真实文件名大小写是否完全一致 |
| 换行符 CRLF/LF | .sh 脚本在 Linux 报 bad interpreter / ^M 错误 | Windows 是 CRLF,Linux 是 LF。用 dos2unix script.sh 转换,或在 Git 配 core.autocrlf |
| 脚本没执行权限 | Permission denied | chmod +x script.sh |
| 路径分隔符 | 硬编码 \ 的路径在 Linux 失效 | 代码里用 path.join() 而非手拼,别写死 \ |
| rm -rf 误删 | 文件不可恢复 | 删前先 ls 确认路径,警惕变量为空的情况 |
| 裸跑 node | 关掉 SSH 服务就停了 | 用 pm2 或 nohup ... & |
| 端口占用 EADDRINUSE | 启动报端口已被占 | lsof -i:端口 查 PID,kill -9 后重启 |
| 磁盘满导致构建失败 | npm/build 报莫名错误 | df -h 查磁盘,清理日志和旧依赖 |
| 环境变量没生效 | process.env.XXX 是 undefined | export 仅当前会话有效,持久化要写进 .bashrc 或用 .env + dotenv |
| sudo 权限 | 装全局包/改系统目录报权限错 | 必要时加 sudo,但别滥用,能不用 root 就别用 |
几条 Windows 用户的额外提醒:
- 在 Windows 上开发,强烈建议装 WSL2(Windows Subsystem for Linux),直接在 Windows 里跑一个真 Linux 环境,本地就能用上所有这些命令,和线上环境一致,能避开一大半"本地能跑线上挂"的问题。
- 终端推荐用 Windows Terminal + WSL,比 CMD/PowerShell 体验好太多。
学习优先级总结
不用一次背完,按这个节奏练:
- 第一周,把"每日必用"练成肌肉记忆:
cd / ls / cat / tail / grep / ps / kill / lsof,能独立登服务器查日志、管进程; - 第二周,掌握"每周常用":
scp / tar / chmod,能自己手动发一次版; - 之后遇到再查"应急命令":
df / top / free / curl,告警时不慌; - 进阶:装
pm2管 Node 进程、Windows 用户上 WSL2,让本地环境贴近线上。