本文列举了一些常用的 shell 指令。
字符串处理(awk) 1 2 cat bench_log.txt | grep "Time used" | awk '{ print $(NF-1) }'
1 2 cat bench_log.txt | grep "Forward time cost" | awk '{ sum+=$(NF-1) } END { print "Average = ", sum/NR }'
1 2 name=$(echo $path | awk -F "/" '{print $NF}' )
字符串替换(sed) 1 2 sed -i "s/xxx/yyy/g" ${file_path} sed -ie "s|xxx|yyy|g" ${file_path}
批量处理(xargs) 1 2 ls *.tar.gz | xargs -n1 -I {} tar -xzvf {}
1 2 3 4 5 dep_list=$(ldd test_bin | awk '{if (match($3,"/")){ print $3 }}' | grep -v "^/lib64" | grep -v "^/lib" ) mkdir libprintf $dep_list | xargs -n1 -I {} cp {} ./libtar -czvf lib.tar.gz lib
解压与压缩
1 2 3 4 5 6 7 8 9 10 11 tar -cvf pack.tar *.jpg tar -czf pack.tar.gz *.jpg tar -cjf pack.tar.bz2 *.jpg tar -czf pack.tar.Z *.jpg
1 2 3 tar -xvf pack.tar tar -xzvf pack.tar.gz tar -xjvf pack.tar.bz2
网络调试
测试 http 接口
1 curl -kv http://127.0.0.1:8080/xxx/yyy -H'Content-Type: application/json' -d'{"name": tom}' | json_pp
抓包
1 tcpdump -i any port 8000 -AAA -nnn
查看端口监听
1 netstat -tunlp | grep <port>
1 2 lsof -i :<port> pwdx <pid>
查看文件
监视文件变化
查找文件内容
1 grep 'content' -r file_name.txt
查看进程工作目录
GDB
GDB 带参数启动程序
1 gdb --args ./bin_file --flagfile flag_file.conf
GDB 调试已有进程
1 attach -> break -> continue -> send request -> print
GDB 一次打印多个值
GDB 一次执行多个命令
1 2 3 4 5 6 7 8 9 10 11 (gdb) next;p num_caches Invalid character ';' in expression. (gdb) define myfun Type commands for definition of "myfun" . End with a line saying just "end" . >next >p num_caches >end (gdb) myfun 731 cpus[j].dcache->owner = (struct godson2_cpu *)&cpus[j]; $4 = 3
LLDB
1 2 3 4 breakpoint set -E c++ breakpoint set -F std::range_error
1 2 lldb platform shell python3 xxx.py
Valgrind 检测内存泄漏 1 valgrind --log-file=memcheck.log --tool=memcheck --leak-check=full --show-leak-kinds=all $bin
查看库内容
1 2 3 4 5 6 ar -t xxx.a nm --demangle xxx.a nm --demangle xxx.so
1 2 3 4 5 6 nm --demangle xxx.a objdump -x ./main | grep NEEDED nm -D -C xxx.so
1 2 3 lipo -info xx.dylib/xxx.a nm -C xxx.dylib/xxx.a otool -L xxx.dylib/xxx.a
查找
1 find . -name "*" | grep ${find_file_name}
1 grep -rn "${find_content} " *
查看进程信息
1 ps aux pid,user,pcpu,pmem,cmd --sort -pmem,-pcpu
通过名称批量杀死进程
1 ps aux | grep $partial_name | awk '{print $2}' | xargs kill -9
查看系统信息
1 grep 'physical id' /proc/cpuinfo | sort -u
1 grep 'core id' /proc/cpuinfo | sort -u | wc -l
查看本机所有逻辑 CPU 核心个数(包括通过超线程技术增加的逻辑 CPU)
1 grep 'processor' /proc/cpuinfo | sort -u | wc -l
Docker
1 docker run -it -p $host_port :$container_port --network=host -v $host_path :$container_path $image_id bash
1 docker run -it --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=all $image_id bash
1 docker commit -a $author -m $commit_message $container_id $new_image_name :$new_image_tag
1 2 3 docker build --network=host --pull -f $docker_file -t $repo_name :$new_image_tag $context_path
进入容器
1 docker exec -it $container_id bash
退出容器但不关闭
停止/杀死容器
1 2 3 docker stop/kill $container_id
1 2 3 docker kill $(docker ps -aq) docker rm $(docker ps -aq) docker rmi $(docker images -aq)
1 2 3 docker save $image_id > xxx.tar docker load < xxx.tar docker tag $image_id yyy:zzz
1 2 docker cp $container_id :$filename $target_filename docker cp $target_filename $container_id :$filename
1 docker run --cap-add sys_ptrace --security-opt seccomp=unconfined
上述两个选项的作用分别是:
由于 GDB 调试需要的 SYS_PTRACE 属性被禁止掉了,所以在启动容器时候需要增加这个属性
GDB 调试时,需要关闭 Linux 虚拟地址随机化(虚拟地址随机化是为了安全考虑而出现的,GDB 调试只是暂时关闭)
1 docker commit -m="$commit_log " $container_id $image_name :image_tag
1 docker build -t $image_name :image_tag .
K8s
1 2 3 4 5 6 7 8 9 10 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube yum install -y kubectl conntrack-tools minikube start --registry-mirror=https://dockerhub.woa.com --addons=dashboard --vm-driver=none --network=host minikube dashboard kubectl proxy --address=0.0.0.0 --accept-hosts='.*'
1 2 3 4 5 6 7 8 kubectl create -f ${config_file_path} kubectl delete -f ${config_file_path} kubectl apply -f ${config_file_path} [--force] kubectl get -f ${config_file_path}
1 kubectl get pods --all-namespaces
1 kubectl -n ${namespace} get pod
1 kubectl -n ${namespace} describe pod ${pod_name}
1 kubectl logs -n ${namespace} ${pod_name}
1 kubectl cp -n ${namespace} ${pod_name} :path/to/file /local/file/path
1 kubectl exec -it -n ${namespace} ${pod_name} bash
ssh 免密登录
1 2 (ssh-keygen -t rsa) scp ~/.ssh/id_rsa.pub $user_name @$remote_ip :~/id_rsa.pub
1 2 3 cat ~/id_rsa.pub >> ~/.ssh/authorized_keyschmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
常见问题:
检查远端用户 .ssh 文件夹及其上级文件夹有无组写权限,有的话需要将其去除
更改文件夹标签:restorecon -r -vv ~/.ssh
给命令设置超时 1 2 3 4 timeout 10 ls gtimeout 10 ls
注:上述时间单位为秒,macOS 需要安装 coreutils
让普通用户具有某条系统命令权限(以 mount、umount 为例) 1 2 3 # /etc/sudoers Cmnd_Alias MOUNT = /bin/mount, /bin/umount ALL ALL=NOPASSWD: MOUNT
进程绑核
1 2 taskset -pc 1,2 `pidof <binary>` taskset -pc 1-4 `pidof <binary>`
1 taskset -p `pidof <binary>`
子进程会继承父进程的绑核信息,分配到 cpu0 和 cpu1 上运行的进程产生的子进程也会被分配到 cpu0 和 cpu1
taskset 可以用 C 函数 sched_setaffinity 和 sched_getaffinity 代替
root 用户修改文件提示 Operation not permitted 1 2 3 4 5 6 7 8 lsattr <filename> chattr -i <filename> chattr +i <filename>
文件权限继承 1 setfacl -R -d -m user::rwx floder
shell 脚本命令行参数 1 2 3 4 5 6 7 8 9 10 11 12 while getopts a:b:c:d: optiondo case $option in a) arg_a=$OPTARG ;; b) arg_b=$OPTARG ;; c) arg_c=$OPTARG ;; d) arg_d=$OPTARG ;; ?) exit 1;; esac echo $option '=' $OPTARG done shift $(($OPTIND - 1 ))
1 ./build.sh -a 123 -b 456
监控进程内存信息
1 2 3 4 5 6 7 #!/bin/bash while :do cat /proc/$1 /status | grep VmRSS | awk '{{ print $2 }}' sleep 1 done
1 2 3 nohup sh res.sh `pidof $binary_name ` &tail -f nohup.outfg
1 watch -n 1 echo $(cat /proc/$(pidof $binary_name )/status | grep VmRSS | awk '{{ print $2 }}' )
ADB
1 2 3 adb push ${pc_file_path} ${phone_file_path} adb pull ${phone_file_path} ${pc_file_path}