some-tips

这是我在学习及工作过程中遇到的一些小的点,记录下来方便以后遇到类型问题后翻阅,相当于一个速查表吧。现发表出来,若您还有其他 tips 愿意和我分享,请通过关于我联系我。此篇文章会不定期更新。

  • crontab 运行记录在 /var/log/cron 文件里

  • 监控系统状况

    • 监控 CPU 情况:sar 1 表示每隔1s打印一次
    • 监控内存情况:sar -r 1
    • sar 安装:yum -y install sysstat
  • 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 参数挂载数据卷时,容器内部没有权限:

  • 虚拟机是 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