写在前面 :本故事纯属虚构,如有雷同,不负责任。为了整理 Linux 开发和日常使用的常用命令,想了好几天才串了这么个故事。虽然有点牵强,但是内容还是挺干的~欢迎大家点评。
在很久很久以前,鹅厂开发类工程师职级分为:助理工程师、工程师、高级工程师和专家工程师四大类。
小特特从北京某学校毕业后,据传因为其性别比较突出,所以很幸运地拿到了工程师的职级,并在毕业后顺利成为了一只新鹅。
1. 班车风云
这天,小特特顶着乱糟糟的头发,穿着拖鞋和短裤,斜挎着塑料编织袋,抓上工卡和手机就挤上了最晚的一趟班车。
正当其憨憨入睡时,手机不知趣地响起了一阵"悦耳"的铃声。那独一无二的动听旋律,小特特不用拿出手机便已知是公司的告警电话。
她慌慌张张从编织袋里拿出手机,按下接听后,一个熟悉的机器女声:"您有一个硬盘告警,IP为...",话音未落,小特特就按下了 1
而自动结束了这次人机对话。
2. 办公室之殇
来到工位后,小特特既娴且熟地打开 xshell 登录到跳板机后,使用 ssh xiaott@1.2.3.4
登录到了硬盘告警的机器。输入 sudo su - worker
切换到 worker 用户后,小特特使用 df -h
命令查看完各分区的容量,再快速输入 du -h --max-depth=1
命令查看当前目录下各文件(及文件夹)的大小。发现 xxx.log 文件占用了近 100 G空间后,她果断地使用了 rm xxx.log
命令将其进行了删除。
删除完文件后,小特特还执行了下 ls –lhS
命令将当前目录下各文件以从大到小的顺序进行展示。
处理完硬盘告警后,小特特通过 ssh
远程连接到了个人云开发机,开始使用 Vim 进行日常开发。<Ctrl n>
自动补齐,ctags
进行函数跳转,filetype
设置语法高亮,quickfix 列表快速编译,vim-fugitive 插件实现在 Vim 中完成各种 git 操作。随着自定义配置和插件的逐步完善,小特特已经能够在 Vim 下完成日常的开发工作。
正当其在代码的世界徜徉时,企业微信上弹出了一个线上服务告警通知。为了避免出现重大外网事故,小特特赶紧登上了告警服务所在的一个机器,先使用 cd
命令切换到服务的运行目录,再使用 tail -f xxx.log.20191212
实时滚动下服务日志。
从滚动的命令行发现错误 log 均出现在请求某个外部 CGI 接口后,小特特使用 awk '-F,' '{if ($666==110) print $999}' xxx.log.20191212
提取出了返回错误的所有 URL。
为了确认是否是必现错误,小特特使用 curl -d
命令模拟了一次请求。由于内部请求使用的是 HTTP 协议,小特特还使用 tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
对模拟请求进行了抓包分析。
小特特确认错误原因是外部接口超时未返回后,立即联系了该接口对应的负责同学。处理完这个问题后,小特特继续了她的开发工作。
当需要安装某个开源库时,小特特使用 rz -bey
命令将本地 Windows 机器上的压缩包传到了开发机,然后使用 md5sum xxx.tar.gz
命令验证传输的文件是否正确,最后再使用 tar xvzf xxx.tar.gz
命令将压缩包解压后进行使用。
find -type f -name README.md
命令在当前工作目录中查找名为 README.md 的所有文件。
临近黄昏时,又一个进程占用 CPU 过高的告警出现在了手机上。登录上机器后,小特特先使用 history | tail -n 200
查看最近执行过的命令列表,看下是否有异常情况。确认无异常后,她使用 top
命令查看系统的 CPU、内存等的使用情况。
在 top
命令的基本视图中,按数字 1
监控每个逻辑 CPU 的使用情况;按 P
实现按 CPU 降序排列,按 M
按内存降序排列。
为进一步查看系统运行现状,小特特还使用 free -h
命令查看了内存的使用情况。发现确实是因为用户请求量增加而导致服务使用 CPU 和内存过高后,小特特急忙通知了运维同学进行了扩容处理。
晚上九点半,小特特基本完成了一天的开发工作,为了测试下新开发的功能是否正常。编译通过后,使用 nohup xxx 9999
启动了进程,并监听在 9999 端口。
启动完进程后,小特特使用 netstat -anp | grep -w 9999
命令确认进程确实在监听 9999 端口。测试过程中,她发现进程加载的一个外部 so 动态库对应功能并没有生效,lsof xxx.so
命令也显示启动的进程并没有加载该 so 文件。
使用 GDB 调试时发现,该 so 并没有导出函数 fffff 。nm -D xxx.so | grep fffff
命令也证实了该 so 确实没有导出该函数。
因为这个 so 是其他团队提供的组件,所以小特特通过 sz
命令将该文件传输到 Windows 机器上后发到了企业微信群进行讨论。
同时,小特特使用 ps aux | grep -w xxx| grep -v grep | awk '{print $2}' | xargs kill -9
停掉了测试进程 xxx
。
3. 结语
数了下,文中出现了近 30 个 Linux 命令,我"太男"了。熟练使用这些命令,个人觉得已经可以应付 Linux 下的初级开发和运维工作了。
欢迎关注