Linux

本文最后更新于 2026年3月18日 下午

Linux有关知识点

目录结构说明


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/  # 根目录(所有目录的起点)
├── bin/ # 基础命令(ls、cp 等,所有用户可执行)
├── sbin/ # 系统管理命令(reboot、ifconfig 等,root 专用)
├── usr/ # 用户程序和数据(类似 Windows 的 Program Files)
│ ├── bin/ # 非启动必需的用户命令(如 wget、vim)
│ ├── sbin/ # 非启动必需的系统命令
│ ├── lib/ # 程序依赖的库文件
│ ├── lib64/ # 64位程序的库文件
│ └── share/ # 共享数据(文档、语言包等)
├── etc/ # 系统配置文件(服务配置、用户信息等)
│ ├── sysconfig/ # 系统服务配置(网络、防火墙等)
│ ├── nginx/ # Nginx 服务配置(示例)
│ └── passwd # 用户账号信息
├── var/ # 动态变化的文件(日志、缓存等)
│ ├── log/ # 系统和程序日志(如 /var/log/messages)
│ ├── lib/ # 服务运行数据(如数据库文件)
│ └── tmp/ # 服务临时文件
├── tmp/ # 临时文件(重启后清空)
├── boot/ # 启动文件(内核、grub 引导程序)
├── dev/ # 设备文件(硬盘、终端等,如 /dev/sda)
├── proc/ # 虚拟文件系统(实时进程、内存信息等)
├── sys/ # 虚拟文件系统(硬件设备管理)
├── lib/ # 系统共享库(类似 .dll 文件)
├── lib64/ # 64位系统共享库
├── mnt/ # 临时挂载外部设备(U盘、移动硬盘)
├── media/ # 自动挂载的外部设备(如光盘)
├── opt/ # 第三方软件安装目录(如 /opt/redis)
└── home/ # 普通用户家目录
├── user1/ # 用户 user1 的家目录(等价于 ~)
└── user2/ # 用户 user2 的家目录
└── root/ # root 用户的家目录(等价于 ~,root 专属)

全选命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## 一、核心全选方法(推荐,跨版本通用)

Vim 没有像 GUI 编辑器那样的 “一键全选” 按钮,但通过「普通模式 + 可视模式」组合,操作高效且通用:

### 步骤(3 步走):

1. **进入普通模式**:按 `Esc` 键(确保当前不是插入模式,底部无 `--INSERT--` 提示);
2. **跳转到文件开头**:按 `gg` 键(`g` 连续按两次,普通模式下直接输入,无需按其他键);
3. **选中全部内容到文件结尾**:按 `VG` 键(先按 `V` 进入「行可视模式」,再按 `G` 跳转到文件末尾,自动选中从开头到结尾的所有行)。

### 效果:

此时文件所有内容会被高亮选中(行可视模式下,整行高亮),后续可执行复制、删除、剪切等操作:

- 复制选中内容:按 `y` 键(`y` = yank,复制);
- 删除选中内容:按 `d` 键(`d` = delete,删除,同时会复制到剪贴板);
- 剪切(移动):删除后粘贴(`p` 粘贴到光标后,`P` 粘贴到光标前)。



### 1. 普通模式直接全选复制(无需手动选中)

如果只是想 “全选并复制”,无需进入可视模式,直接在普通模式下输入:
:%y
解释:

- `%`:Vim 中表示 “整个文件”(等价于从第一行到最后一行);
- `y`:复制(yank);
- 效果:直接复制全部内容到 Vim 剪贴板,无需手动选中,更快捷

VIM


vim方向键

移动方向普通模式(高效,推荐)插入模式(输入时)补充说明
向下(下一行)j(核心)

+(下一行开头)

N+j(跳 N 行,如 10j)
Enter(换行到下一行开头)

Ctrl+j / Ctrl+n(仅下移光标)
j 是 Vim 最核心的下移键,单手操作,比↓快
向上(上一行)k(核心)

-(上一行开头)

N+k(跳 N 行,如 3k)
Ctrl+k / Ctrl+pk 对应上移,和 j 配对,主键区单手操作
向右(右一列)l(小写 L,核心)

空格

N+l(跳 N 列,如 5l)
→(方向键)

Ctrl+f
l 对应右移,主键区(jkl 分别对应下上右,像游戏方向键)
向左(左一列)h(核心)

Backspace(退格键)

N+h(跳 N 列,如 4h)
←(方向键)

Ctrl+b
h 对应左移,jklh 是 Vim 最基础的方向键
操作场景模式按键(仅移动光标)效果优点
输入时想下移光标(不换行)插入模式Ctrl + j / Ctrl + n光标下移一行(同↓)不用挪手,单手按,比方向键快
输入时想上移光标(不换行)插入模式Ctrl + k / Ctrl + p光标上移一行(同↑)同上
输入时想左 / 右移光标插入模式 / (方向键)光标左 / 右移一列直观,新手最易接受
退出输入后高效移动光标普通模式j(下)k(上)h(左)l(右)光标仅移动,无任何修改主键区,不用挪手,最快

高阶移动

需求普通模式按键说明
移动到当前行开头0(数字 0)一键到行首,比←快
移动到当前行结尾$(美元符)一键到行尾
移动到文件第一行gg全局开头
移动到文件最后一行G(大写)全局结尾
移动到第 N 行N+G(如 50G)直接跳到第 50 行

定时任务


CentOS

路径核心职能层级典型场景
/etc/rsyslog.conf日志收集与分发「源头」决定日志写到哪个文件,比如把认证日志存到 secure
/etc/logrotate.conf全局轮替默认规则「兜底模板」所有日志默认每周轮替、保留 4 份
/etc/logrotate.d/应用专属轮替规则「个性化覆盖」nginx 日志单独配置「每天轮替、保留 30 份」

logrotate 核心配置规则全解析

规则分类配置规则核心含义典型使用场景
🔴 基础轮替策略daily执行日志轮替高频产生的应用日志(如 Nginx/MySQL 日志)
weekly执行日志轮替(默认)系统低频日志(如 /var/log/messages
monthly执行日志轮替归档类日志(如财务 / 审计日志)
yearly执行日志轮替极少更新的核心系统日志
rotate N保留 N 份归档日志,超过则自动删除(N 为数字)rotate 7 → 保留 7 天 / 周 / 月的日志,旧的自动清理
size 大小不按时间,按文件大小触发轮替(支持 K/M/G,如 size 100M日志产生速度不稳定的场景(比如突发流量导致日志暴涨)
minsize 大小日志达到指定大小满足时间规则,才触发轮替(避免空日志频繁轮转)weekly + minsize 10M → 每周轮替,但日志至少 10M 才执行
maxsize 大小日志未到时间规则,但达到指定大小也触发轮替(避免日志过大)monthly + maxsize 1G → 每月轮替,但日志超 1G 就提前轮转
🟡 文件处理规则create轮替后自动创建空的新日志文件(权限 / 属主和原文件一致)绝大多数场景必配(避免进程写日志时文件不存在)
create 权限 属主 属组轮替后创建指定权限 / 属主的新日志(如 create 0640 root adm安全敏感日志(如 /var/log/secure,限制普通用户读取)
dateext归档日志添加日期后缀(格式 YYYYMMDD,如 hsp.log-20260318需要按日期回溯日志的场景(替代默认的数字后缀 hsp.log.1
dateformat -%Y%m%d_%H自定义日期后缀格式(支持 % Y/% m/% d/% H 等)dateformat -%Y%m%d_%H%M → 精确到分(如 hsp.log-20260318_2130
compress归档日志自动gzip 压缩(生成 .log-20260318.gz节省磁盘空间(推荐对非实时查看的旧日志启用)
compresscmd 命令指定压缩命令(默认 gzip,可改为 bzip2/xz 等)compresscmd /usr/bin/bzip2 → 用更高压缩率的 bzip2 压缩
delaycompress延迟压缩(只压缩上一轮的归档,当前归档不压缩)需要临时查看最新归档日志的场景(避免刚轮转的日志就被压缩)
nocompress不压缩归档日志实时需要读取归档日志的场景(如监控告警分析)
copytruncate先复制原日志为归档,再截断原日志为 0 字节(不改变文件句柄)进程无法重启的场景(如 Java 应用、Nginx 不重启重新打开日志)
nocreate轮替后不创建新日志文件仅归档旧日志,新日志由应用自行创建的场景
missingok日志文件不存在时,不报错、不中断轮替非必现的临时日志(如调试日志,可能被手动删除)
notifempty日志文件为空时,跳过轮替操作避免空日志生成大量无用归档
🟢 高级控制规则sharedscripts多个日志文件轮替时,脚本只执行一次(而非每个文件执行一次)轮替后重启服务的场景(如 postrotate 重启 rsyslog,避免重复重启)
postrotate ... endscript轮替完成后执行指定脚本 / 命令(包裹在两者之间)postrotate + systemctl reload nginx → 轮替后让 Nginx 重新加载日志文件
prerotate ... endscript轮替开始前执行指定脚本 / 命令轮替前备份日志到远程存储、校验日志完整性等
su 属主 属组以指定用户 / 组身份执行轮替(避免 root 权限过高)应用日志属主为非 root 时(如 su www www 处理 Nginx 日志)
olddir 目录归档日志移动到指定目录(需和原日志同分区)归档日志单独归类(如 olddir /var/log/archive
nomail日志轮替 / 删除时不发送邮件通知(默认)无需关注日志清理的普通场景
mail 邮箱日志超过保留数被删除时,发送归档日志到指定邮箱审计 / 合规场景(需留存删除日志的记录)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/var/log/nginx/*.log {
daily # 每天轮替
rotate 30 # 保留30天日志
size 100M # 即使没到1天,日志超100M也轮转
create 0640 www www # 新日志权限0640,属主www
dateext # 日期后缀(如 access.log-20260318)
compress # 压缩旧日志
delaycompress # 延迟压缩(最新归档不压缩)
missingok # 日志不存在不报错
notifempty # 空日志不轮转
sharedscripts # 多个日志只执行一次脚本
postrotate # 轮替后重新加载Nginx
/usr/bin/systemctl reload nginx > /dev/null 2>&1
endscript
}

定时任务触发方式的区别

系统定时触发方式对应文件 / 服务
CentOS传统 cron 任务/etc/cron.daily/logrotate(shell 脚本)
Ubuntu现代 systemd 定时器logrotate.timer + logrotate.service(真正执行日志轮替的服务)

Ubuntu 中的具体对应:

  • 不再使用 /etc/cron.daily/logrotate 脚本,而是通过 systemd 定时器来调度。

  • 查看状态:

    1
    2
    3
    4
    5
    6
    # 查看定时器状态
    systemctl list-timers logrotate.timer
    # 查看服务定义
    systemctl cat logrotate.service
    # 手动触发一次轮替(和 CentOS 执行 /etc/cron.daily/logrotate 效果一样)
    sudo logrotate /etc/logrotate.conf
  • 软件本身:Ubuntu 中对应的依然是 logrotate 软件包。

  • 定时调度:CentOS 用 cron.daily 脚本,Ubuntu 用 logrotate.timer systemd 定时器。

  • 功能等价:两者最终都是每天自动执行 logrotate 来轮替日志。

Ubuntu和 CentOS 的核心对比

维度CentOS(传统 cron 方式)Ubuntu 24.04(systemd 方式)
触发方式/etc/cron.daily/logrotate 脚本(由 cron 每天执行)logrotate.timer 定时器(由 systemd 每天触发)
执行命令/usr/sbin/logrotate /etc/logrotate.conf完全相同:/usr/sbin/logrotate /etc/logrotate.conf
配置文件/etc/logrotate.conf + /etc/logrotate.d/完全相同,配置规则通用
手动触发sudo /etc/cron.daily/logrotatesudo systemctl start logrotate.servicesudo logrotate /etc/logrotate.conf

Linux
http://yething.github.io/posts/1406167115.html
作者
Odyssey
发布于
2025年7月12日
许可协议