some-tips
这是我在学习及工作过程中遇到的一些小的点,记录下来方便以后遇到类型问题后翻阅,相当于一个速查表吧。现发表出来,若您还有其他 tips 愿意和我分享,请通过关于我联系我。此篇文章会不定期更新。
-
crontab 运行记录在
/var/log/cron文件里 -
监控系统状况
- 监控 CPU 情况:
sar 1表示每隔1s打印一次 - 监控内存情况:
sar -r 1 - sar 安装:
yum -y install sysstat
- 监控 CPU 情况:
-
CPU 信息:
cat /proc/cpuinfo -
内存信息:
cat /proc/meminfo -
CPU 占用率:
cat /proc/stat -
四个进程,每个进程 8 线程跑,OS 会按照 32 个线程调度,而不是 4 个进程调度?
-
ffmpeg 使用 map 参数时,需要对每个视频分别指定编码参数,包括编码器,否则会使用默认编码器(libx264)。
-
文件的三个时间:
stat file可查看- ctime:Change time,状态修改时间
- atime:Access time,访问时间
- mtime:Modify time,文件修改时间
-
docker 使用
-v参数挂载数据卷时,容器内部没有权限:run时加上--privileged=true特权;- 临时关闭 selinux
setenforce 0 - 添加 SELinux 规则: http://www.openskill.cn/article/520
-
虚拟机是 CentOS7,在和外网通信时需要关闭防火墙
systemctl stop firewalld -
bash 运行多个命令:
bash -c 'cmd1 && cmd2,这在 docker 中很有用。 -
显示一个路径的所有权限:
namei -om /path/to/check -
nslookup命令可以查看某个域名所解析的记录值 -
top -bn 5可以输出到文件 -
进行多任务并发测试时,不能统计每个进程时间再相加,会重复统计。
-
.表示将另一个脚本中内容包含进来并执行 -
bash 执行
set -i vi可以以 vim 方式操作命令行。 -
git status 命令对中文文件名乱码:
git config --global core.quotepath false -
vim下使用:%!xxd将文本转换为十六进制,:%!xxd -r可转换回来。 -
tc可用来模拟丢包; -
vim命令行操作,类似
vim +PluginInstall +qall -
netstat -s
命令和ss命令可以查看网络相关情况 -
golang 中的
break label和continue label语法可以很方便地在嵌套循环中控制外层循环。 -
man -w
可以列出所有 man 手册的位置; -
listen 函数中 backlog 参数指定全连接队列的长度。
-
压测时客户端可能出现大量连接处于 TIME_WAIT 状态,导致连接被用完;
-
QPS= 并发数 / 平均响应时间;
-
shell 中 esc + back 键可以快速删除当前命令行一部分;
-
数组中元素内部带有互斥锁时,不能通过
for _,val:=range(array){}访问,因为会拷贝锁; -
求文件交、并、差集:
grep -F -f a.txt b.txt可以求两个文件的交集;sort a.txt b.txt | uniq -d也可以求两个文件的交集;sort a.txt b.txt | uniq求并集;sort a.txt b.txt b.txt | uniq -u求差集 a.txt - b.txt
-
sed 's/.*([0-9]*).*/\1/g' file可以提取字符串,\1表示用第一个括号里面的内容替换掉整个字符串。 -
golang 语法糖之三个点:
- 用于可变参数列表,如
func foo(keys ...int){}; - 用于打散slice,如
slice=append(slice,other_slice...); - 用于自动确定数组长度,如
array:=[...]int{1,2,3,4,5}; - 用于 go get 下载所有的包,如
go get github.com/abc/xyz/...
- 用于可变参数列表,如
-
w命令可以用来看谁都登录了机器并且在做什么; -
免密登录服务器步骤:
- 本机生成公钥/密钥:
ssh-keygen - 本机编辑 config 文件:
vim ~/.ssh/config - 将公钥上传到远程主机上:
ssh-copy-id user@host
- 本机生成公钥/密钥:
-
yes | yum install xxx
自动输入 yes; -
一个坑:golang MySQL 包调用 rows.Scan() 前必须调用 rows.Next(),否则会失败。
-
golang 中如果不想让 struct 中某个字段序列化到 json 中,可以指定它的 field 为
`json:"-"`。 -
接手一个项目代码时,可以先了解下其功能及大体流程,然后跟踪关键部分代码,而不必要对细枝末节过于追究,如解析配置等。
-
pwdx命令可以根据 pid 查到可执行文件具体路径。 -
可以调研下在 macOS 和 iOS 上都可以跑的 docker,这样就可以去掉虚拟机,直接在 docker 上运行虚拟机。镜像及相关数据通过 iCloud 备份,真正实现「云办公」。
-
vmware 开启共享文件夹后看不到/权限问题:
vmhgfs-fuse .host:/ /mnt/hgfs -o uid=1000 -o gid=1000 -o umask=0033或者vmhgfs-fuse -o allow_other .host:/ /mnt/hgfs -
python -m SimpleHTTPServer 8899 可以直接从服务器下载文件
-
sed 处理的时候,会先去掉换行符,处理完成后再加上。因此无法直接替换掉换行符,需要使用模式空间来处理;
-
代码注释:NOTE, OPTIMIZE, TODO, HACK, XXX, FIXME, and BUG;
-
不要轻易 "相信" 别人。使用别人服务或接口前,要经过充分验证。cle
-
cat file | while read line; do XXX; done有可能只会读一行,原因是 XXX 命令从标准输入将缓冲区内容全部读走了。解决方法是XXX </dev/null -
git merge 时出现冲突,文本文件好解决,二进制问题可使用
git checkout xxx —theirs或git checkout xxx —ours使用自己或对方的版本。 -
gdb -tui xxx可图形界面调试; -
golang 的
Label在嵌套函数(闭包)是不可用的. 不管是在闭包里调用闭包外的Label, 还是在闭包外调用闭包里的Label -
A:=[]int{0,1,2} var index int for index=0;index<len(A);index++{}; println(index) A:=[]int{0,1,2} var index int for index=range A{}; println(index) //打印结果一样吗,为什么? -
centOS8 中很多软件包缺失,可以用
yum whatprovides ifconfig查找; -
二进制文件分析工具
- file -- 查看文件类型
- ldd -- 显示二进制的依赖库
- ltrace -- 显示调用的库函数
- strace -- 显示调用的系统调用
- hexdump -- 以可读形式显示二进制内容
- strings -- 打印二进制中可打印的字符串
- readelf -- 显示 elf 相关信息
- objdump -- 打印汇编
- nm -- 打印符号表
-
iptables -A INPUT -p tcp --dport 1935 -j DROP 打开某端口
-
gcc 内置宏定义列表:
gcc -dM -E - < /dev/null -
程序性能分析:https://fenbf.github.io/AwesomePerfCpp/
- perf/gperftools/valgrind/g
-
shell 脚本中,通过管道传递数据给 while,然后在循环中修改变量,循环结束后变量未被修改。原因:管道会在子 shell 中执行。有四种解决方法:
-
#here document while read line do #do sth done <<< "abc" -
#read from file while read line do #do sth done < /path/to/file -
#process replacement while read line do #do sth done < <(cmd) -
#replacement stdin exec </path/to/file while read line do #do sth done
-
-
ffmpeg 的一些使用:
-
ffmpeg -i input.flv -c:v copy -bsf:v trace_headers -f null - -
Shell Parameter Expansion: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
-
c++ 中各个平台宏判断:
#ifdef _WIN32
#ifdef _WIN64
#else
#endif
#elif __APPLE__
#ifdef TARGET_IPHONE_SIMULATOR
#elif TARGET_OS_IPHONE
#elif TARGET_OS_MAC
#elif __ANDROID__
#elif __linux__
#elif __unix__
#elif defined(_POSIX_VERSION)
#else
error "unknown"
#endif
-
cmake 编译时,加上
-DCMAKE_VERBOSE_MAKEFILE=ON可以显示编译时的命令,便于分析问题 -
使用 ffmpeg api 时,如果编译时出现 undefined reference xxx 问题,检查一下 ffmpeg 头文件是否用 extern "C" 包起来了。。
-
不要在 shell 脚本中使用
return true或者return false,否则判断返回值的时候不小心写成if ${ret}会让你怀疑人生。正确做法是return 0或者return 1