做Linux运维,日常最多的工作就是排查线上问题,面试官特别喜欢问这类场景题。
比如说线上一个nginx服务突然访问不了了,你会怎么一步步排查?
别上来就说重启服务,那是最菜的做法,重启了问题下次还会出现。先做什么?先看看nginx进程还在不在啊,用ps aux | grep nginx看一下,要是进程没了,先去看日志啊,日志在哪里?大部分默认在/var/log/nginx下面,看看error.log里面有没有报错,是端口被占用了,还是配置文件写错了。
要是进程还在,那看什么?看端口有没有起来啊,用netstat -lntp或者ss -lntp看80或者443端口有没有被nginx监听,要是没监听,那还是配置的问题。要是端口正常监听了,那看看能不能本地访问,直接curl localhost:端口,看看能不能拿到正常的响应,要是本地都拿不到,那就是nginx本身的问题,要是本地能拿到,那就是网络的问题啊。
是不是防火墙挡了?看看iptables的规则,或者firewalld有没有开对应的端口,再就是看看前端的负载均衡、反向代理有没有问题,是不是安全组把端口封了。就这一步步排查,能说清楚顺序的,都是真的处理过问题的,瞎说一通的,肯定是没怎么碰过线上故障。

还有一个高频问题,就是磁盘满了怎么排查?这个看起来简单,好多人也会答错。第一步肯定是df -h看一下哪个分区满了对吧?找到了哪个分区,然后去哪里找大文件?好多人说find / -size +100M,这样找没错,但有一种情况你想不到,就是有的文件已经被删除了,但是进程还握着文件句柄没释放,这种情况下df会显示磁盘满了,但是你找大文件根本找不到,对不对?
那这种情况怎么处理?要用lsof | grep deleted,就能找到那些已经被删除但是还没释放空间的文件,要是这些文件很大,把对应的进程重启一下,空间就释放出来了,这个点真的是区分新手和熟手的关键,好多没踩过这个坑的人,根本不知道还有这种情况。
我刚入行的时候就踩过这个坑,当时线上一个服务打日志,把磁盘打满了,我直接rm把日志文件删了,结果df看磁盘还是满的,我查了半天才搞明白怎么回事,那时候才记住这个知识点,现在面试的时候只要问这个题,我把这个点说出来,面试官基本都会点头。