1 | { |
shell
1 | cat /tmp/data.json | jq '.data[0].metrics.memory.total' |
1 | cat /tmp/data.json | jq -r '.data[] | "\(.host): total memory = \(.metrics.memory.total) MB"' |
Python
1 | import json |
遍历所有主机
1 | for host_data in data['data']: |
1 | { |
1 | cat /tmp/data.json | jq '.data[0].metrics.memory.total' |
1 | cat /tmp/data.json | jq -r '.data[] | "\(.host): total memory = \(.metrics.memory.total) MB"' |
1 | import json |
遍历所有主机
1 | for host_data in data['data']: |
1 | import psutil |
🧠 模块作用
psutil(process and system utilities)用于获取系统运行的进程信息、CPU、内存、磁盘、网络等资源的使用情况,广泛用于监控脚本和性能分析。
| 功能 | 代码示例 | 说明 |
|---|---|---|
| 查看 CPU 信息 | psutil.cpu_percent() | 获取 CPU 使用率(默认是瞬时值) |
| 多核 CPU | psutil.cpu_percent(percpu=True) | 获取每个 CPU 的使用率 |
| CPU 核心数 | psutil.cpu_count(logical=False) | 获取物理核心数 |
| 内存信息 | psutil.virtual_memory() | 返回内存总量、已用、剩余等 |
| 交换内存 | psutil.swap_memory() | 获取交换分区使用情况 |
| 磁盘使用 | psutil.disk_usage(‘/‘) | 获取某个挂载点的磁盘使用情况 |
| 磁盘 IO | psutil.disk_io_counters() | 读取/写入字节数与次数 |
| 网络 IO | psutil.net_io_counters() | 网络传输字节和包数 |
| 网络接口 | psutil.net_if_addrs() | 获取每个网络接口的 IP 等信息 |
| 当前进程 | psutil.Process() | 获取当前进程的 CPU/内存等信息 |
| 所有进程 | psutil.pids() / psutil.process_iter() | 遍历所有 PID 并查看进程状态 |
用户交互性例子
1 |
|
判断机器的系统类型
1 | __main() { |
颜色输出
1 |
|
1 | // 单行注释 |
定义变量:
1 | package main |
短变量声明: num := 100
1 | fun main() { |
变量的内存地址:
1 | package main |
变量交换
1 | package main |
变量的作用域
1 | package main |
常量中的数据类型只能是: 布尔型、数字型(整数型,浮点数型和复数)和字符串类型。
不可改变的量
1 | const identifier [type] = value |
iota (常量计数器)
1 | package main |
| 功能 | 作用 | 举例 |
|---|---|---|
| sys.argv | 获取命令行参数 | sys.argv[1] |
| sys.exit() | 退出程序 | sys.exit(“错误退出”) |
| sys.stdout | 标准输出流(可重定向) | sys.stdout.write(“text\n”) |
| sys.stderr | 标准错误输出流(用于报错) | sys.stderr.write(“错误\n”) |
| sys.stdin | 标准输入(代替 input()) | sys.stdin.readline() |
| sys.platform | 当前操作系统平台 | ‘linux’, ‘win32’ 等 |
| sys.path | 模块搜索路径 | sys.path.append(…) |
| sys.version | Python 版本字符串 | ‘3.11.4 (…)’ |
| sys.getsizeof() | 获取对象占用内存大小 | sys.getsizeof([1,2,3]) |
静态分析工具
是用于禁用 ShellCheck 静态分析工具对特定规则(SC2317 和 SC2162)的警告的注释指令。
1 | # shellcheck disable=SC2162 |
SC2086:双引号引用变量
1 | # 错误写法(会触发 SC2086): |
SC2155:不要在声明和赋值中同时使用命令替换
1 | # 错误写法(会触发 SC2155): |
SC1009:if 等语句语法错误
1 | # 错误写法(会触发 SC1009): |
1 |
|
nsenter 是 Linux 下的一个命令,可以进入其他进程的命名空间(namespace),比如:
–mount 表示进入挂载命名空间(即文件系统环境)
–pid 表示进入进程空间
–net 表示进入网络空间
等等……
这意味着你可以“变成另一个进程看到的世界”。
/host/proc/1/ns/mnt 是宿主机中 1 号进程的挂载命名空间文件
容器内的 /proc/1/ns/mnt 是容器的命名空间
通常容器里会把宿主机的 /proc 挂载到 /host/proc 下
1 号进程 在宿主机上就是 init 进程,也就是整个系统的根命名空间
1 | bash <<<"..." |
表示把函数定义输出出来:
1 | declare -f func1 func2 ... |
1 | my_func() { |
输出:
1 | my_func() { |
sed “$a __main”
1 | sed "\$a __main" |
在最后加上一行 **main,表示自动调用 **main 函数
配置好工作目录后,就可以编码开发了,在这之前,我们看下 go 的通用项目结构,这里的结构主要是源代码相应地资源文件存放目录结构。
gopath 目录就是我们存储我们所编写源代码的目录。该目录下往往要有 3 个子目录:src,bin,pkg。
src —- 里面每一个子目录,就是一个包。包内是 Go 的源码文件
pkg —- 编译后生成的,包的目标文件
bin —- 生成的可执行文件。
.在 HOME/go 的目录下,(就是 GOPATH 目录里),创建一个目录叫 src,然后再该目录下创建一个文件夹叫 hello,在该目录下创建一个文件叫 helloworld.go,并双击打开,输入以下内容:
1 | packge main |
2 . 执行 go 程序
方式一:
1 | go run helloworld.go |
方式二:
1 | step1:打开终端:在任意文件路径下,运行: |
注意,在编译生成 go 程序的时,go 实际上会去两个地方找程序包:
GOROOT 下的 src 文件夹下,以及 GOPATH 下的 src 文件夹下。
在程序包里,自动找 main 包的 main 函数作为程序入口,然后进行编译。
step2:运行 go 程序
在/home/go/bin/下(如果之前没有 bin 目录则会自动创建),会发现出现了一个 hello 的可执行文件,用如下命令运行:
./hello
import "fmt" 告诉 go 编译器这个程序需要使用fmt包的函数,fmt 包实现了格式化 IO(输入/输出)的函数1 | import ( |
点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的 fmt.Println(“hello world”)可以省略的写成 Println(“hello world”)。
1 | import ( |
别名操作的话调用包函数时前缀变成了我们的前缀,即 f.Println(“hello world”) 3. _操作
这个操作经常是让很多人费解的一个操作码,
1 | import ( |
_ 操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。
main() , 是程勋运行的入口
下载安装包
1 | 打开官网:https://go.dev/dl/ |
配置变量环境
1 | vim ~/.zshrc |
下载安装包
1 | https://studygolang.com/dl |
Ubuntu&CentOS 下载安装 Golang
1 | # 安装go 环境 |
1 |
|
IEEE754 浮点数格式
f = (-1)^s _ M _ 2^E
s 代表符号位,M 代表尾数,E 代表指数
第一步
1 | // 浮点数举例 |
第二步
1 | 1001.101 = (-1)^0 * 1.001101 * 2^3 |
| 符号位 | 指数位(8 位) | 尾数位(23 位) |
|---|---|---|
| 0 | 10000010 | 0011010000000000000000 |
IEEE 754 双精度(double)浮点数格式
| 名称 | 位数 |
|---|---|
| 符号位 | 1 |
| 指数位 | 11 |
| 尾数位 | 52 |
| 合计 | 64 |
第一步:
正数: 符号位=0
第二步:
转换二进制
1 | 9.625 = 1001.101 = 1.001101 * 2^3 |
第三步:
指数(带偏移)
1 | 存储指数 = 1023 + 3 = 1026 |
第四步:
尾数
标准化后的是 1.001101
->尾数位只要去掉 1. , 补齐 52 位,
1 | 0011010000000000000000000000000000000000000000000000 |
第五步:拼接完整的 64 位
1 | 符号位:0 |
分为八组
1 | 01000000 00100011 01000000 00000000 00000000 00000000 00000000 00000000 |
UTF-8 万国码 中文占 3 个字节
GBK 中国区的编码 中文占 2 个字节
如果想要所有文字 需要都是 utf-8 的编码
1 |
|
理解变量和常量的概念
掌握常见数据类型:int、float、char、double
学会使用 scanf 读取输入,printf 输出内容
编写一个简单的计算器程序(加法)进行练习
1 | int age = 25; //声明int类型变量age,值为25 |
| 类型 | 占内存(字节) | 说明 | 示例值 |
| —— | ————– | ————– | ———- | ——— |
| int | 4 | 整数类型 | 123, -45 |
| float | 4 | 小数(精度低) | 3.14, -0.1 |
| double | 8 | 小数 | (精度高) | 3.1415926 |
| char | 1 | 单个字符 | ‘A’, ‘z’ |
1 |
|
浮点数
1 |
|
1 | int main() { |