Linux 小工具与知识 

Last Update: 2023-11-07

目录

获取 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 当前的温度。

卸载移动硬盘

移动硬盘通过 USB 连接到 Linux 系统之后会被自动识别。

但卸载移动硬盘除了使用 umount 命令卸载挂载点之外还需要使用 eject 命令移除移动硬盘。

让 rm 更安全

运行 rm *.txt 前执行 echo rm *.txtecho *.txt 看一下匹配结果。

如果要递归删除文件和目录,则可以使用 find 代替 rm -r 例如: find . -name "*.txt" -print

然后,如果结果符合预期,把 -print 改为 -delete: find . -name "*.txt" -delete

用 watch 刷新命令执行结果

基本所有的发行版都带有 watch ,它可以自动重复执行命令并显示执行结果。

  1. 命令格式: watch [args] [cmd]
  2. 命令参数:
    • -n--interval: 指定间隔的时间,如果缺省,每 2 秒运行一次指令。
    • -d--differences: 会高亮显示不同的部分。
    • -d=cumulative: 以第一次执行为基准,高亮显示所有变动过的地方都。
    • -t-no-title: 关闭 watch 命令在顶部的时间间隔,命令,当前时间的输出。
    • -h--help: 查看帮助文档。

查看磁盘使用情况

fdisk -lparted -l 最详细。

df [options] device 显示文件系统的磁盘使用情况,空间数值计算默认使用 1k block:

lsblk 可以查看磁盘信息,但看不到使用情况。

查看文件与文件夹大小

du [option] [file [file]...] 显示每个文件和目录的磁盘使用空间:

  1. -a-all: 显示目录中个别文件的大小。
  2. -b-bytes: 显示目录或文件大小时,以 byte 为单位。
  3. -c--total: 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  4. -k--kilobytes: 以 KB ( 1024 bytes ) 为单位输出。
  5. -m--megabytes: 以 MB 为单位输出。
  6. -s--summarize: 仅显示总计,只列出最后加总的值。
  7. -S--separate-dirs: 显示个别目录的大小时,并不含其子目录的大小。
  8. -h--human-readable: 以 K,M,G 为单位,提高信息的可读性。
  9. -x--file-system: 以一开始处理时的文件系统为准,略过其它不同的文件系统目录。
  10. -D--dereference-args: 显示指定符号链接的源文件大小。
  11. -H--si: 与 -h 参数相同,但是 K,M,G 是以 1000 为换算单位。
  12. -X <file>--exclude-from=<file>: 指定的 ( 目录内的 ) 文件中记录了要被排除的文件,要和 --exclude=( <file> | <dir> ) 区分开。
  13. --exclude=( <file> | <dir> ): 略过指定的目录或文件。
  14. -L<symbolLink>--dereference<symbolLink>: 显示符号链接的源文件大小。
  15. -l--count-links: 重复计算硬件链接的文件。

一般只用 du -sh

设置全局代理

全局的 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 里面,重启系统后全局生效。

top 命令

top 命令的第五行最后一个指标 avail Mem 的含义是: 不发生 swap 的条件下,可分配给程序的内存大小。

VIRT 是进程使用的虚拟内存。RES 进程使用的未被 swap 的物理内存。SHR 共享内存大小。

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

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>