Linux 零散工具与方法
Table of Contents
1. 获取 CPU 温度
对于 Intel CPU 来说,网上很多教程都说使用 cat /sys/class/thermal/thermal_zone0/temp
获取的值,除以 1000 就是 CPU 温度。在多数时候,这个值是 CPU 附近的温度,但不是 CPU 的温度。
执行以下命令可以看到系统中可以显示的温度的来源 (thermal_zone 从 0 开始):
root@dy:~# cat /sys/class/thermal/thermal_zone*/type acpitz TCPU x86_pkg_temp
其中 x86_pkg_temp
所属的 thermal_zone 才是 CPU 的 thermal_zone。从输出中可以知道 x86_pkg_temp
属于 thermal_zone2,那么这样获取到的才是 CPU 的温度:
root@dy:~# cat /sys/class/thermal/thermal_zone2/temp 52000
最终的值除以 1000 就是 CPU 的温度,当前 CPU 52 度。
而对于 AMD CPU 来说,要这样找:
root@gen10:~# grep -r . /sys/class/hwmon/hwmon*/name /sys/class/hwmon/hwmon0/name:k10temp /sys/class/hwmon/hwmon1/name:fam15h_power /sys/class/hwmon/hwmon2/name:amdgpu root@gen10:~# grep -r . /sys/class/hwmon/hwmon*/temp* /sys/class/hwmon/hwmon0/temp1_crit:100000 /sys/class/hwmon/hwmon0/temp1_crit_hyst:99000 /sys/class/hwmon/hwmon0/temp1_input:42125 /sys/class/hwmon/hwmon0/temp1_max:70000 /sys/class/hwmon/hwmon2/temp1_input:42000 /sys/class/hwmon/hwmon2/temp1_label:edge
注: 正常来说,第二条命令的输出应该还有一行 /sys/class/hwmon/hwmon0/temp1_label:CPU Temperature
表示 temp1 的值是 CPU 温度。
找到 k10temp 所在的目录是 /sys/class/hwmon/hwmon0 那么,这个目录下 temp1_input 的值除以 1000 就是 CPU 当前的温度。
2. 卸载移动硬盘
移动硬盘通过 USB 连接到 Linux 系统之后会被自动识别。
但卸载移动硬盘除了使用 umount 命令卸载挂载点之外还需要使用 eject 命令移除移动硬盘。
3. 让 rm 更安全
运行 rm *.txt
前执行 echo rm *.txt
或 echo *.txt
看一下匹配结果。
如果要递归删除文件和目录,则可以使用 find
代替 rm -r
例如: find . -name "*.txt" -print
然后,如果结果符合预期,把 -print
改为 -delete
: find . -name "*.txt" -delete
4. 用 watch 刷新命令执行结果
基本所有的发行版都带有 watch
,它可以自动重复执行命令并显示执行结果。
- 命令格式:
watch [args] [cmd]
- 命令参数:
-n
或--interval
: 指定间隔的时间,如果缺省,每 2 秒运行一次指令。-d
或--differences
: 会高亮显示不同的部分。-d=cumulative
: 以第一次执行为基准,高亮显示所有变动过的地方都。-t
或-no-title
: 关闭 watch 命令在顶部的时间间隔,命令,当前时间的输出。-h
或--help
: 查看帮助文档。
5. 查看磁盘使用情况
fdisk -l
和 parted -l
最详细。
df [options] device
显示文件系统的磁盘使用情况,空间数值计算默认使用 1k block:
-l
: 仅显示本地文件系统的相关信息。-h
: 输出部分的空间数值以 M 计算。-i
: 输出部分的空间数值以 inode 计算。
lsblk
可以查看磁盘信息,但看不到使用情况。
6. 查看文件与文件夹大小
du [option] [file [file]...]
显示每个文件和目录的磁盘使用空间:
-a
或-all
: 显示目录中个别文件的大小。-b
或-bytes
: 显示目录或文件大小时,以 byte 为单位。-c
或--total
: 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。-k
或--kilobytes
: 以 KB ( 1024 bytes ) 为单位输出。-m
或--megabytes
: 以 MB 为单位输出。-s
或--summarize
: 仅显示总计,只列出最后加总的值。-S
或--separate-dirs
: 显示个别目录的大小时,并不含其子目录的大小。-h
或--human-readable
: 以 K,M,G 为单位,提高信息的可读性。-x
或--file-system
: 以一开始处理时的文件系统为准,略过其它不同的文件系统目录。-D
或--dereference-args
: 显示指定符号链接的源文件大小。-H
或--si
: 与-h
参数相同,但是 K,M,G 是以 1000 为换算单位。-X <file>
或--exclude-from=<file>
: 指定的 ( 目录内的 ) 文件中记录了要被排除的文件,要和--exclude=( <file> | <dir> )
区分开。--exclude=( <file> | <dir> )
: 略过指定的目录或文件。-L<symbolLink>
或--dereference<symbolLink>
: 显示符号链接的源文件大小。-l
或--count-links
: 重复计算硬件链接的文件。
一般只用 du -sh
。
7. 设置全局代理
全局的 http 代理:
export HTTP_PROXY=http://192.168.2.10:10811
export HTTPS_PROXY=http://192.168.2.10:10811
export http_proxy=http://192.168.2.10:10811
export https_proxy=http://192.168.2.10:10811
注意: 有些程序使用大写的环境变量,有些程序使用小写的环境变量,所以最好大小写都配置一下。当然,还有些程序不使用这些环境变量,比如 Firefox。
如果要持久化配置可以把上面的代码块写在 ~/.bashrc 里面,重启系统后全局生效。
8. top 命令
top 命令的第五行最后一个指标 avail Mem
的含义是: 不发生 swap 的条件下,可分配给程序的内存大小。
VIRT 是进程使用的虚拟内存。RES 进程使用的未被 swap 的物理内存。SHR 共享内存大小。
9. Shell 重定向中 2>&1 的含义
$ command >file 2>&1 $ command >>file 2>&1
放在 > 后面的 & ,表示重定向的目标不是一个文件,而是文件描述符,内置的文件描述符有:
1 => stdout 2 => stderr 0 => stdin
即, 2>1 代表将 stderr 重定向到当前路径下文件名为 1 的普通文件中,而 2>&1 代表将 stderr 重定向到文件描述符为 1 的文件 (即 /dev/stdout) 中,这个文件就是 stdout 在文件系统中的映射。
此外,以下三种写法等价 (前两行的 &> 与 >& 视作整体):
&>file >&file >file 2>&1
注意 2>&1 一定要放在 stdout 重定向 >file 的后面。
两者顺序不一样,效果也不一样:
find /etc -name .bashrc >list 2>&1 find /etc -name .bashrc 2>&1 >list
第一条: 先将 stdout 的内容重定向到文件,此时文件 list 就是这个程序的 stdout,再将 stderr 重定向到 stdout,也就是文件 list。
可以近似地看成指针关系:
# 先执行 >list stdout -> list stderr -> stderr # 再执行 2>&1 stdout -> list stderr -> stdout (-> list)
第二条: 先将要输出到 stderr 的内容重定向到 stdout ,此时会产生一个 stdout 的拷贝,也就是有了 2 个 stdout。旧的 stdout 依旧负责程序的 stdout,新的 stdout 负责输出程序的 stderr。两个 stdout 相互独立互不影响。
# 先执行 2>&1 stdout -> stdout stderr -> new_stdout # 再执行 >list stdout -> list stderr -> new_stdout
10. fio 测试磁盘性能
测试延迟: 队列深度 1, bs=4k,模拟单个队列读写
吞吐: 队列深度 32, bs=128k,尽量跑满磁盘带宽
iops: 队列深度 32, bs=4k,要在最短的时间内多去读磁盘
测试小文件读写性能要测随机读写,测试大文件读写性能通常要测顺序读写。
测试顺序读 IOPS: fio -name=Seq_Read_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=read -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>
测试顺序写 IOPS: fio -name=Seq_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=write -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>
测试随机写 IOPS: fio -name=Rand_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>
测试随机读 IOPS: fio -name=Rand_Read_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>
测试混合读写: fio -name=Read_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randrw -rwmixread=70 -refill_buffers -norandommap -randrepeat=0 -ioengine=libaio -bs=4k -size=20G -numjobs=1 -runtime=600 -ioscheduler=noop
测试写吞吐量: fio -name=Write_BandWidth_Test -group_reporting -direct=1 -iodepth=32 -rw=write -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=1024k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>
测试读吞吐量: fio -name=Read_BandWidth_Test -group_reporting -direct=1 -iodepth=32 -rw=read -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=1024k -size=20G -numjobs=1 -runtime=600 -filename=/dev/<device>