陈小涛的技术学习笔记

Linux 基础命令与目录结构

最早接触 Linux 的时候,最不习惯的是两件事:一是"一切皆文件",二是没有 C 盘 D 盘,所有东西都从一个 / 往下挂。那时候我记命令的方式是硬背,背了忘、忘了背,效率极低。后来才发现,命令根本不用背全——真正每天在用的就那么十几条,剩下的查手册就行。真正需要先想清楚的,是"目录树每一层是干嘛的"和"权限到底怎么算的"。这篇不是那种从头讲到尾的说明书,是把我自己平时怎么用的顺序整理出来,当备忘录用。

目录树常用命令权限位进程常驻踩坑记录

一、根目录:每个位置各管一摊

Linux 只有一个根 /,所有东西都挂在它下面。刚上手时会觉得乱,其实是分工太明确了——每个目录都有它该干的事,只是没人告诉你。我整理了一下自己常打交道的几个:

路径装的是什么我的使用习惯
/home普通用户的家目录,你自己的文件基本都在这里登录后默认就落在这附近,个人脚本放 ~/bin
/etc系统与软件的配置改任何程序的配置,第一反应就是来这找
/var会不断变化的数据:日志、缓存、队列查问题先看 /var/log,网站文件多在 /var/www
/tmp临时文件重启可能就没了,我从不在这存东西
/opt自己额外装的大型第三方程序我把自己的项目放在 /opt 下,跟系统的东西隔开
/usr系统装的可执行文件与库只读心态,不手动往里塞东西
/ /home /etc /var /opt /usr www/ log/ snapzp/ 网站文件(/var/www) 日志(/var/log) 我的静态站点一般落在 /var/www/snapzp 下
我实际用的目录结构:站点在 /var/www,出问题先翻 /var/log
顺手的做法:看到一个新目录,先 ls -lh 看一眼里面有什么、权限是什么,比直接进去乱翻安全得多。养成习惯之后,"这个文件是谁的、能不能改"这个问题基本不用问人。

二、按场景记命令,比按字母表记靠谱

我试过按字母表背命令,效果很差——因为记住了字母,遇到问题还是想不到该用哪条。后来改成按"我要干嘛"来分组记,明显更实用。下面这四组,覆盖了我 90% 的日常操作。

场景一:先搞清楚"我在哪、这有什么"

# 我在哪个目录
pwd

# 这底下有什么(-l 详细 / -h 人类可读的单位 / -a 含隐藏文件)
ls -lh
ls -lah

# 目录有多大,一级一级看是哪个占地方
du -sh *
du -h --max-depth=1 /var | sort -h

# 磁盘还剩多少(最常被忽略、又最容易出事的一条)
df -h

这几条里,df -h 我是吃过亏才养成习惯的。磁盘写满之后,很多程序不会报"磁盘满",而是行为诡异——日志写不进去、上传直接失败,排查半天找不到原因。现在我每天上手的第一件事就是瞄一眼剩余空间。

场景二:看内容、翻日志

# 看整个文件
cat app.conf

# 长文件一页页翻,q 退出;/ 是搜索
less app.log

# 只看最后 100 行,日志排错最常用
tail -n 100 app.log

# 实时盯着日志往下滚(Ctrl+C 退出)
tail -f app.log

# 从一堆日志里捞关键字
grep -n "ERROR" app.log
grep -rn "timeout" /var/log/

tail -f 是我用得最多的一条。程序在跑、你改了配置想确认有没有生效,直接盯着这个窗口看它有没有新报错,比反复重启去猜直观。

场景三:搬文件、做备份

# 建目录,-p 表示父目录不存在也一起建
mkdir -p /opt/app/data

# 复制(-r 递归 / -a 保留权限与时间)
cp -a /opt/app /opt/app.bak

# 移动或改名
mv old.txt new.txt

# 删除(危险,见下面坑点)
rm -rf old_dir

# 跨机器传文件
scp -r ./dist user@host:/var/www/
坑点:rm -rf 后面的路径一定要盯着看完再回车。我给自己定的规矩是:删之前先 ls 一遍同一个路径,确认看到的东西就是我以为要删的那些,然后再把命令里的 ls 改成 rm -rf。多花三秒,能避免一次事后后悔。

场景四:看进程和端口

# 程序在不在跑
ps aux | grep node

# 谁占着 443 端口(这个非常常用)
ss -ltnp | grep :443

# 本机能不能通到某个端口
curl -I http://127.0.0.1:8000

# 结束一个进程
kill <PID>
kill -9 <PID>     # 强制,最后手段

三、权限那三个数字到底怎么来的

权限是初学者最容易含糊过去的一块。其实拆开看很简单——rwx 三个字母,换成数字就是 4 + 2 + 1 = 7,然后按"拥有者 / 同组用户 / 其他人"排三组,就是那三位数。

- r w x r - x r - - 拥有者 = rwx = 7 同组 = r-x = 5 其他 = r-- = 4 合起来就是 754 r=4 读 · w=2 写 · x=1 执行 网站静态文件 644 足够,可执行脚本才需要 755
三位数不用背,拆开就是三个 rwx 相加
# 给文件设权限
chmod 644 index.html     # 拥有者可读写,其他人只读
chmod 755 deploy.sh      # 脚本要给执行位

# 改归属:把文件交给运行它的那个用户
chown -R www-data:www-data /var/www/snapzp

# 看当前用户属于哪些组
groups
一个容易忽略的点:文件能不能被某个程序读到,看的是运行这个程序的那个用户的权限,而不是你自己的。所以本地测试好好的、放到服务器上就报"权限不足",多半是属主不对,用 chown 调一下就好,别急着改成 777。

说到 777,我的态度很明确:尽量不要用。它是"给所有人全部权限",能让报错立刻消失,但同时也把问题藏起来了。先用 ls -l 看清属主和权限,多数情况下把属主改对就够了。

四、让程序关掉终端也不死

自己写的程序要一直跑着,不能一关终端就没了。以前大家用 nohup 加 &,现在更规范的方式是交给 systemd——它管开机自启、管崩溃拉起、管日志,一个配置文件全解决。

# /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/app.js
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

写完配置,四条命令走完流程:

systemctl daemon-reload        # 改了配置文件就先执行这条
systemctl enable myapp         # 开机自启
systemctl start myapp          # 立即启动
systemctl status myapp         # 看状态

journalctl -u myapp -n 100     # 看它的日志,-f 可以实时跟
journalctl -u myapp --since "10 min ago"
为什么推荐 systemd:日志统一走 journalctl,不用自己写重定向;Restart=always 让程序崩了自动起来,半夜挂掉不用等人救;改了配置 daemon-reload 一下就行,不用记各种后台进程的 PID 文件放哪。

五、我自己踩过的几个坑

小结

把这几件事做顺,一个最基础的 Linux 工作流就通了:知道自己在一个树状目录的哪一层 → 用 ls/df/du 看清现状 → 用 chmod/chown 把权限摆正 → 用 systemd 把程序常驻起来 → 出问题去 /var/log 和 journalctl 找线索。剩下都是具体场景里的经验积累,不用一次性学完。