Linux  TipS MySelf

Linux TipS MySelf

Scroll Down

0、阿里云Linux软件源地址

ubuntu软件源地址

centos各个版本地址

centos7软件包地址

centos各个版本软件包地址:
https://mirrors.aliyun.com/centos/版本/os/x86_64/Packages/

1、find命令

# find -exec command {} \;
固定用法,其中{}代表 find 的结果,相当于find ……|xargs
# find -mtime n
# find -mmin n
……
类似-mtime、-ctime、-atime 等等根据时间搜索,其中n代表时间。

+n代表早于给定数值的时间之前,-n代表在给定数值的时间之内

例如:
# 在当前目录下搜索 比当前时间的10个小时之前更早被修改过内容的数据
# find . -mtime +10
#
# 在当前目录下搜索 当前时间的10小时之内被修改过内容的数据
# find . -mtime -10

find_time_diff.png

+ - 符号在 find 命令的 -size 等选项中同样有 大于、小于给定数值之用

2、df、du命令

df 命令基于系统的文件系统来计算磁盘的占用情况的,通过 df 命令可以查看系统中的每一个文件系统的容量、已用、挂载点等信息

du命令是基于系统中的文件来计算磁盘的占用情况,通过计算每一个文件的占用情况来汇总出每一个目录或每个文件的占用情况

df 命令常用参数:

-a		统计包含虚拟的、重复的和不可访问的文件系统
df -a		输出系统中的所有文件系统的磁盘占用情况


-B		指定统计磁盘占用情况的单位,
		主要的单位有K、M、G、T、P、E、Z、Y等
df -BM		以 M 为单位输出每个文件系统的磁盘占用情况


-h		以一种友好的形式来进行展示,
		主要是对统计的大小按照K、M、G等单位进行处理
df -h


-H 		以一种友好的形式来进行展示,
		但是处理的过程不是按照标准的1024来进行处理,
		而是通过1000来就进行处理,所以结果会有一定的误差
df -H


-l		只显示本机的文件系统的磁盘占用情况
df -l


-i		查看文件系统中的索引节点(inode)的磁盘占用情况
df -i


-T		展示每一个挂载点文件系统的类型
df -T

-t		限制查看的磁盘的文件系统类型
# 只统计 ext3 类型文件系统的磁盘占用情况
df -t ext3  或 df --type=ext3

du 常用命令参数:

du 默认情况输出的都是文件夹的空间使用量,而不会输出单个文件的空间占用

duDefaultOutput.png

-a		显示目录所有文件的磁盘资源占用,不仅仅是目录本身
# 统计/home/zjib下所有文件的磁盘资源占用,不仅仅是目录本身
du -a /home/zjib

-B 		指定统计磁盘占用情况的单位,
		主要的单位有K、M、G、T、P、E、Z、Y等
		(等同于--block-size=)
du -BM


-c		除了显示每个目录和文件单独的磁盘占用,
		同时显示该文件或目录的总磁盘占用
du -c


-d		指定统计目录下的最大深度
		(等同于--max-depth=N)
du -d 1 /home


-H		和 -h 相似,单位换算通过1000来计算,而不是1024
	

-s		仅显示总计空间占用量大小

-m、-k		分别代表以M、K为单位显示

duS.png

dud.png

3、strace 命令

strace 命令常用来跟踪进程执行时的系统调用和所接受的信号。在Linux中,操作系统不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用来访问硬件设备。

strace 命令可以追踪到一个进程产生的系统调用,包括参数,返回值,执行所消耗的时间。我认识 strace 命令源于追踪 df 命令卡住时,排查服务器故障。

strace_kubectl_get.png

strace 命令的输出,每一行都是一条系统调用,等号左边是系统调用的函数名和参数,右边是该调用的返回值。strace 命令显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

strace 个人常用参数:

-c 统计每一系统调用的所执行的时间,次数和出错的次数等

-h 输出strace命令简要帮助

-T 显示每一调用所耗的时间

-o filename 将strace的输出写入文件filename

-p pid 跟踪指定的进程pid

-u username 以username 的UID和GID执行被跟踪的命令

4、符号链接(软硬通吃)(照搬作者的通俗说法,原文可见参考2)

硬链接就是:一面墙上有一个洞,洞里放着一个苹果。从墙的这一面看是这个苹果,从墙的另一面看还是同一个苹果。硬链接就是同一块数据但有两个不同的名字,读写的时候本质上都是修改的同一块数据。
硬链接在删除的时候只是删除了一个名字(实际上是删除了一个inode)。只有一块数据的所有名字都删除了的时候,数据才会被删除。(删除的时候相当于把墙的这一面糊上,但苹果本身不动,只有两面都糊上了,你才会看不到)

符号链接(软链接)就是:我声称我有一个苹果,但是当你找我要的时候,我对你说,到某个建筑物的仓库就可以拿到那个苹果了。可见我并不真正拥有一个苹果,我只是拥有“某个地方有一个苹果”这个信息。但对于外部的观察者来说,这跟我实际上拥有一个苹果并无差异。
符号链接的删除:假设符号链接死了,不会影响到原始数据。假设原始数据没了,那这个符号链接就变成了一张空头支票,也就是悬空的符号链接。

5、监控Linux用户的操作

# 创建存取操作日志的目录
mkdir /data/command_history
chmod 777 /data/command_history
# 修改配置文件
vim /etc/profile
export HISTORY_FILE=/var/log/command_history/`date '+%Y-%m-%d'`.log
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$5}")  #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $HISTORY_FILE'
# 所有用户具有写入操作日志文件权限
sudo chmod a+w $HISTORY_FILE

HISTORY_FILE定义了要保存的命令日志文件名格式,这里是按照当天的日期命名,同一天会记录在一个文件中

PROMPT_COMMAND中,date "+%Y-%m-%d %T用于获取执行操作时的时间;中间的#仅作为分隔符使用;$(who am i |awk "{print \$1\" \"\$5}")命令作用是获取登录的用户名和ip;$(history 1 | { read x cmd; echo "$cmd"; })";作用是获取前一个的输出作为标准输入,通过read块处理功能

source /etc/profile

日志结果展示:

2021-08-12 05:01:25 ##### root (192.168.4.170)  #### cat /data/command_history/2021-08-12.log
2021-08-12 05:02:23 ##### root (192.168.4.170)  #### cat /etc/profile
2021-08-12 05:05:43 ##### zhijb (192.168.4.170)  #### sadasdas
2021-08-12 05:05:43 ##### zhijb (192.168.4.170)  #### sadasdas

存在一点小瑕疵就是,可能会有一些export环境变量的命令乱入

6、磁盘bps、iops指标

bps: 每秒读取块设备的数据量(byte/s)

kbps = bps / 1024

mbps = kbps / 1024

iops:每秒操作次数

bps、iops都有read、write两种

7、shell cat 缩进问题

都知道 cat命令可以用来查看文件和向文件内写入内容,使用起来比较方便,但是在shell中使用cat命令的时候,会有那么亿点点的小问题~

7.1 shell中cat的缩进

如果cat结合for循环来使用,那么cat命令不可避免的就要使用一定缩进,比如我想使用cat结合for循环追加内容到文件内

$cat test.sh 
#!/usr/bin/bash
for(( i=0;i<5;i++))
do
        cat >> test.log <<EOF
        $(echo $i)
EOF
done

$bash test.sh
$cat test.log 
        0
        1
        2
        3
        4

从以上的脚本内容和输出可以看出,首先我们将cat和for结合了起来,如果只是使用<<EOF,那么末行结尾处EOF必须顶格写,不然就会导致报错。当代码过多时,这样非常影响美观度。

这时候我们可以考虑使用<<-EOF,对比之下,比之前多了一个小横杠-,而且结尾符也是可以自定义的,比如<<-eof<<-end<<-End等等都是可以的,这时候结尾处的结尾符就可以进行缩进了,但是请注意,缩进必须使用制表符(也就是键盘Tab按出来的制表符,而不是空格按出来占位符,否则就会报错),请看如下例子:

cat_shell_tab

cat_shell_kongge
上例就充分表明了,cat结尾符缩进时必须使用制表符Tab

并且,还有一个小点就是:如果你希望追加到文件的内容有缩进的话,那此时必须使用空格占位符,因为制表符Tab会被忽略

cat_shell_ignore_tab

cat_shell_noignore_kongge

7.2 shebang

再有就是,不同发行版本的默认shell不同,centos下默认是bash,ubuntu下默认是sh,你写的shell脚本可能在bash下正常运行,转到sh下就会提示报错,这点需要注意一下

shell某些语法在 sh 解释器下会报语法问题,bash 执行就没问题,然后 sh 执行脚本有个选项 -x 可以查看每一行执行的返回结果,bash 则没有这个选项,如果bash下想要同样使用这个功能,可以在shell脚本的shebang下加一行 set -x ,然后bash 脚本运行的时候就能够返回每一行的执行结果。

8、shell 中 sed 个别标识符

# sed 匹配文件非空行和非#开头的注释行
sed  -n "/^\s*[^# \t].*$/p" file

上述命令小解释:

//是sed的分隔符

^\s*[^# \t].*$ 匹配#开头的注释行和空行的正则表达式

此处^表示匹配行开头

\s*匹配0个或多个空格(制表符和空格)(如果有)转义字符\s表示空格,*代表0个或多个字符

[^# \t]匹配非#、空格和制表符\t,其中[^]表示匹配非什么什么,

.* 可匹配所有字符

$ 匹配行尾

9、根据inode删除文件

有些特殊情况下,无法根据文件名删除文件,比如文件有一些特殊字符,比如文件名开头末尾有空格制表符的情况。这个时候就可以根据inode号来删除该文件

首先通过find找到该文件,随后执行需要的操作即可,如下:

# 首先通过ls查看该文件的inode
ls -il

# 交互式删除
find . -inum inode号 -exec rm -i {} \;

# 清空文件
cat /dev/null > `find 路径 -inum inode`

# 删除文件
rm -rf `find 路径 -ium inode`

10、进程相关

进程优先级:

1 - 99: 实时优先级,数字越大,优先级越高

100 - 139: 静态优先级,数字越小,优先级越高

Nice值: 对应静态优先级-20、19

进程分类:

CPU-Bound: CPU密集型,消耗CPU比较大

IO-Bound: IO密集型,消耗IO比较大

进程内存:

Page Frame: 页框,用于存储页面数据(存储page)。物理页面通常被称作Page Frames,而虚拟地址空间的页面通常被称为pages。Linux以page为单位管理内存。此处可参考 内存pages和page Frames的区别

常驻内存集(Resident size): 是分配给进程使用实际物理内存,而不是磁盘上缓存的虚拟内存。RSS内存包括所有分配的栈内存和堆内存,以及加载到物理内存中的共享库占用的内存空间,但不包括进入交换分区的内存。

虚拟内存集(virtual size):虚拟内存是计算机系统内存管理的一种技术,它使得应用程序认为拥有连续的可用的内存(一个连续完整的地址空间),而实际上它通常是被分隔或多个物理内存碎片

参考:

1、strace参考
2、软硬连接作者:henix

3、监控linux操作1

4、监控linux操作2

5、sed qa参考

6、内存pages和page Frames的区别