记录一次面试引发的一个小问题
一次面试,面试官问:你知道http状态码中499是什么吗?一脸懵逼。面试官很客气的说可以去nginx源码里面找到。面试官都这么说了,再去百度找,就太对不起自己这个准运维人员的身份了。好了话不多说,去源码找吧。
进了源码我就二脸懵逼了。
[root@localhost src]# pwd /linux/nginx/nginx-1.12.2/src [root@localhost src]# ls -R | wc -l 340
源码里面各种.c、.h文件小340个,难道一个一个去找?所以就想能不能开发一个小工具,自己去遍历所有文件,并且输入一个想要找的字符串,如果文件里面有就返回给我文件名,并提示我,没有结果的直接扔掉?
shell脚本工具写出来了,不是很完美,不过为了以后对单个文件的使用,不打算再把循环遍历写进去了。
脚本功能:输入一个文件,输入想查询的字符串。如果文件中有,则提示 in 文件名 found some informations about 字符串。如果不存在,可以输出 字符串not exits in 文件,这里我直接把不存在的结果仍了。
脚本内容:
[root@localhost test]# cat 2.sh #!/bin/bash #定义退出码状态为65 E_PARAMERR=65 #定义读取的文件名 FILE_PARSE=$1 usage () { #显示脚本使用方法,示例:./infile.sh filename.txt letters echo "Usage:`basename $0` file letters" 2>&1 #退出脚本,退出状态码为65 exit $E_PARAMERR } #如果指定参数不为两个,显示相关信息,打印Usage,并退出 if [ $# != 2 ] then echo "invaild args." 2>&1 usage fi #如果指定文件不存在,显示相关信息,打印Usage,并退出 if [ ! -f "$1" ] then echo "$1:No such file." 2>&1 usage fi #如果没有指定统计字符,显示相关信息,并退出 if [ -z "$2" ] then echo "$2:No letters specified." 2>&1 usage fi var=`cat $FILE_PARSE | grep $2` 2>&1 > /dev/null if [ -z "$var" ] then echo "$2 not exits in $1" 2>&1 > /dev/null else echo "in $1. found some informations about $2" fi
有投机取巧的成分,不过做出来也值的肯定。下来就是见证脚本可用性了。
[root@localhost src]# for i in `find ./ -type f`;do bash 2.sh $i 499;done in ./http/ngx_http_request.h. found some informations about 499 in ./http/ngx_http_core_module.c. found some informations about 499 in ./http/ngx_http_special_response.c. found some informations about 499
终于,找到了到底是哪里再定义这些specail_response状态码了。
[root@localhost http]# cat ngx_http_special_response.c | grep 499 ngx_null_string, /* 499, client has closed connection */
得到结论:499状态码是客户端主动断开链接后定义的响应状态码,再nginx的access日志中会大量出现。