日志 Linux
2018-05-03
配置
# cat /etc/logrotate.conf
weekly
su root adm
rotate 4
create
#dateext
#compress
include /etc/logrotate.d
以 Nginx 配置为例:
# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 按日切割
missingok # 如果文件不存在,则不创建
rotate 14 # 最多保留 14 个日志文件
compress # 压缩
delaycompress # 延迟压缩
notifempty # 如果文件为空,则不创建
create 0640 www-data adm
# 可能一次切割多个日志,
# 但是后面遇到的每个脚本都只执行一次,
# 在所有日志切割之前或之后
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
其他常用选项:
dateext
部分日志需要添加日期后缀
lastaction/endscript
最后执行的指令,很有用,比如最后将日志备份到某些地方
比如:
rsync -au *.gz 192.168.64.234:/backup/nginx-logs/`hostname -s`/
参考资料与拓展阅读
Linux b2a
2018-02-02
sudo apt install sharutils
提供四个命令:
- shar: create a shell archive
- unshar: unpack a shar archive
- uudecode: decode an encoded file
- uuencode: encode a file into email friendly text
uuencode 是一种二进制转文本编码,类似 Base64
没想到还有些包依赖这个上世纪遗留下来的编码(包括 gcc):
apt rdepends sharutils
sharutils
Reverse Depends:
建议: file-roller
依赖: wide-dhcpv6-client
推荐: speechd-el
建议: patool
推荐: mgp
建议: lxqt-archiver
推荐: ldapscripts
依赖: kpatch-build
依赖: knews
建议: git-dpm
依赖: gcc-9-source
依赖: gcc-12-source
依赖: gcc-11-source
依赖: gcc-10-source
建议: engrampa
依赖: biabam
推荐: aespipe
python uuencode
import uu
uu.encode('/etc/passwd', '-')
注意:3.11 开始,python Deprecated 了这个 uu 模块, 可以改用 binascii.b2a_uu
代替。
import binascii
s = b''
with open('/etc/passwd', 'rb') as f:
buf = f.read(45)
while len(buf) > 0:
s += binascii.b2a_uu(buf, backtick=False)
buf = f.read(45)
print(s)
Linux 文件系统
2018-01-25
物理结构
- 机械硬盘 Disk -> 盘片/盘面 Platter -> 磁道 Tracker -> 扇区 Physical Sector
- 光盘
- SSD -> NAND Package -> Die -> Plane -> Block -> Page
- 非易失性存储器(永久):NAND Flash
- 易失性存储器(临时):DRAM
扇区大小是厂商定的,一般是 512B 的倍数。
老的机械硬盘一般是 512B 扇区,新的机械硬盘一般是 4K 扇区(AF,Advanced Format)
光盘(CD/DVD)一般是 2K 扇区。
处于向前兼容的目的,其他类型存储设备的大小也一般是 512B。
逻辑结构
- 逻辑扇区 Logical Sector
- 块 Block
Windows 下叫做 簇 Cluster,或者磁盘分配单元。
PS:内存上的类似概念,是段 Segment 和页 Page
$ sudo fdisk /dev/sda -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7EC7FA37-FE79-46C1-A404-56AA0E00CFAB
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 83884031 79685632 38G Linux filesystem
格式化
https://zh.wikipedia.org/wiki/磁盘格式化
对于部分硬盘制造厂商,它也被称为初始化。
最早,低级格式化被用于指代对磁盘进行划分柱面、磁道、扇区的操作。
现今,随着软盘的逐渐退出日常应用,应用新的编址方法和接口的磁盘的出现,这个词已经失去了原本的含义,大多数的硬盘制造商将低级格式化定义为创建硬盘扇区(sector)使硬盘具备存储能力的操作。现在,人们对低级格式化存在一定的误解,多数情况下,提及低级格式化,往往是指硬盘的填零操作。
- 高级格式化、逻辑格式化
根据用户选定的文件系统,在磁盘的特定区域写入特定数据,以达到初始化磁盘或磁盘分区、清除原磁盘或磁盘分区中所有文件的一个操作。
高级格式化包括对主引导记录中分区表相应区域的重写、根据用户选定的文件系统,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间,以便用户使用该分区管理文件。
常见文件系统类型
- FAT / FAT32 / exFAT
- NTFS
- EXT2 / EXT3 / EXT4
- BTRFS
- Apple HFS
参考资料与拓展阅读
Bash Linux 命令行
2018-01-11
我写 Shell 脚本一般都是用 bash 执行,一般我会在头部插入 set -xue
命令, 助记:蛇血。
那么这个命令的作用是什么呢?
set 是 bash 提供的一个命令,用来管理 bash 的一些行为。
x
: 在执行命令前,输出所有命令,包括参数。
u
: 遇到未定义变量时,报错。
e
: 如果遇到错误,程序退出。
其他更多参数,参考:set --help
或 help set
。
Linux Vim 编辑器 CheatSheet
2018-01-03
我并不是个 Vim 高手,但是我所掌握的知识对于轻量使用来说,也够用了。
这就是我能想到的全部 Vim 知识。
如果你是一个新手,看看这篇文章,应该可以快速入门 Vim,能解决所有简单编辑任务所会面临的问题。
基础知识
避免由于意外操作而不知所措。
模式
- 普通模式(Normal):直接打开文件(
vim filepath
)就进入了这个模式,可以移动光标,执行一些指令
- 插入模式(Insert):像普通编辑器一样编辑文本
- 可视模式(Visual):先在普通模式下移动光标到目标区域,然后切换到可视模式,这时移动光标就可以选中一块区域,对着块区域的内容执行一些命令
- 命令模式:在 Vim 底部输入命令,按回车执行
- 选择模式(Select):正常我们能够理解的选中,然后删除或者对着一块进行替换
- Ex 模式:。。。
模式切换:
- 在任何模式下按 Esc 就可以回到普通模式;
- 普通模式下,按
i
进入插入模式;
- 普通模式下,按
v
进入可视模式(字符);
- 普通模式下,按
V
进入行可视模式;
- 普通模式下,按
Ctrl
+ v
进入块可视模式;
- Windows 系统下 Ctrl + v 被占用作为粘贴快捷键,可以使用 Ctrl + q 代替;
- 普通模式下,按
:
进入命令模式;
- 可视模式下,按
Ctrl
+ g
进入选择模式;
- 选择模式下,可以按
Ctrl
+ o
回退到可视模式;
快捷键
上下左右,翻页(PageUp,PageDown),删除(Backspace,Del)本身就可以用,就不用记快捷键了。
Key |
Function |
u |
撤销 |
dd |
删除当前行 |
3dd |
删除当前行 + 后面两行(共 3 行) |
>> |
缩进 |
<< |
取消缩进 |
== |
自动对齐 |
使用命令 5d 删除第五行
使用命令 5,10d 删除第 5 到第 10 行
跳转
Key |
Function |
gg |
跳到第一行 |
20gg |
跳到第 20 行 |
G |
跳到最后一行 |
10j |
往前跳 10 行 |
10k |
往后跳 10 行 |
hjkl 本身用来表示左上下右,所以...
复制粘贴
Key |
Function |
yy |
复制当前行 |
3yy |
复制当前行 + 后面两行(共 3 行) |
yw |
复制当前单词和后面的空白字符 |
p |
Paste 粘贴在当前行、字符后面 |
P |
Paste 粘贴在当前行、字符前面 |
搜索
Key |
Function |
? |
向后搜索(正则) |
/ |
向前搜索(正则) |
# |
向后搜索当前单词,等同于输入 #\<xxx\> |
* |
向前搜索当前单词,等同于输入 /\<xxx\> |
- n/N 跳到上一处或下一处
\cp[a-z]*n
忽略大小写,搜索 p 开头,n 结尾的单词
命令
一般都有取消配置的 set noXXX
命令。
Key |
Function |
set nu |
显示行号 |
set paste |
粘贴模式(避免开启自动缩进时,会弄乱粘贴内容) |
set ignorecase / set ic |
搜索忽略大小写 |
set hlsearch |
高亮搜索结果(似乎是默认) |
set nohlsearch |
取消高亮搜索结果 |
noh |
关闭高亮 |
set listchars=tab:>~,trail:. |
显示 TAB 键和行末空格 |
set cursorline |
当前行加上下划线 |
替换
Key |
Function |
s/Gitee/Gitea/g |
将当前行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/g |
将所有行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/gi |
...忽略大小写 |
%s/Gitee/Gitea/gin |
...不真正执行,只反馈印象范围 |
5,10s/Gitee/Gitea/g |
将第 5 到 10 行所有 Gitee 替换成 Gitea |
.,+5s/Gitee/Gitea/g |
将当前行到后两行所有 Gitee 替换成 Gitea |
保存
Key |
Function |
q |
退出(可能会提示你:已修改但尚未保存) |
w |
保存 |
wq |
保存并退出 |
x |
保存并退出 |
q! |
不保存,强行退出 |
:w !sudo tee % |
没有写入权限的时候提权保存 |
清空数据:gg
+ 1000dd
(跳到第一行,然后删除 1000 行)
> filepath
# 或
echo > filepath
参考资料与拓展阅读
包管理工具 Linux Ubuntu Debian APT
2017-12-25
搜索
apt search xxx
检索
apt list
apt list --installed
apt list --upgradable
升级
apt update
apt upgrade
apt-file
apt-file list youtube-dl
apt-file search bin/update-locale
其他
apt search
apt show
apt install
apt reinstall
apt remove
apt autoremove
apt full-upgrade
apt edit-sources
apt satisfy
apt-mark
apt-key
apt-config
apt-cache
apt-add-repository
Linux
2017-12-06
比较独特的命令 [
WebServer Apache Linux
2017-11-09
项目中有一个下载日志文件的功能,大致流程是 WEB 后端调用底层方法收集并压缩一些 .log 文件生成一个 zip 压缩包,放在 /tmp 目录下,前端访问指定路径下载。
之前系统环境用的 CentOS 6.5,现在升级到了 CentOS 7,结果测试时发现下载文件下载失败。
Linux awk LinuxTextProccessing
2017-10-15
awk 的文档写出来可能有一本很厚的书,里面甚至有一种内嵌的解释性编程语言在里面。但是我们普通人就把他当一个小工具,了解一下基础用法就好了,不用深入研究。它的基本功能是将字符串切割之后按照 $1
... $n
来处理,$0
表示整个字符串(整行)。
Linux grep LinuxTextProccessing
2017-10-13
egrep
= grep -E
fgrep
= grep -F
# -G, --basic-regexp 基本正则, 默认
# -E, --extended-regexp 拓展正则
# -P, --perl-regexp Perl 正则
# -w 完全匹配字词
# -x 完全匹配整行
grep markjour /var/log/auth.log
grep -E markjour /var/log/auth.log
# -F, --fixed-strings
grep -F markjour /var/log/auth.log
tail -1000 /var/log/auth.log | grep -Ev 'gnome-keyring-daemon|CRON'
-r
目录
-R
目录,处理软链
-v
排除
-i
忽略大小写 (ignore-case
)
-m
控制匹配次数
-a
包含二进制内容的文件当作纯文本处理
-
-I
包含二进制内容的文件跳过
-
-b
输出命中内容的偏移量
-n
输出行号
-o
仅输出匹配部分
-h
不输出文件名(匹配多个文件时默认输出文件名 -H
)
-L
, --files-without-match
仅输出没有匹配的文件名
-l
, --files-with-matches
仅输出匹配文件名
-
-c
, --count
仅输出文件名和匹配行数
-
--include=GLOB
只查找匹配 GLOB(文件模式)的文件
--exclude=GLOB
跳过匹配 GLOB 的文件
--exclude-from=FILE
跳过所有匹配给定文件内容中任意模式的文件
-
--exclude-dir=GLOB
跳过所有匹配 GLOB 的目录
-
-B
, --before-context=NUM
打印文本及其前面NUM 行
-A
, --after-context=NUM
打印文本及其后面NUM 行
-C
, --context=NUM
打印NUM 行输出文本
-NUM
等同于 --context=NUM