- 如何以只读模式,用 vi/vim 查看文件。
vim -R a.txt //用只读模式启动 Vim
- 假设你启动 nginx 时,发现 error log 提示 8080 端口被占用。如何找到当前占用 8080 端口的进程,并杀掉这个进程?
查看占用某个端口的进程(如8080)
lsof -i:8080
//netstat -apn | grep 8080
//mac版本中的netstat是精简版,不支持,最多可以用:
netstat -anv | grep 8080 //可以看到端口,但是不知道是谁占用的,不知道其pid
根据进程id杀进程(如PID为1412)
ps 1412
kill 1412
kill -9 1111 //强制杀死进程
- 无法访问 www.liulishuo.work,如何定位原因?(提示可以从 DNS、TCP 连接、路由方面查看)
首先 ping www.liulishuo.work 是否可以访问,若不可:
host www.liulishuo.work / nslookup www.liulishuo.work 用来测试域名系统工作是否正常。如果出错,你可能会想到是网络不通了,下面可以测试本地到114.114.114.114的联通性(114.114.114.114和8.8.8.8,这两个IP地址都属于公共域名解析服务DNS其中的一部分)
如果发现网络是通的,要怎么知道nslookup命令失败的原因呢?其中最简单的一种,就是开启nslookup的调试输出,查看查询过程中的详细步骤,排查其中是否有异常。
nslookup -debug www.liulishuo.work 比如出现下面这种错误
图片: https://uploader.shimo.im/f/s9hLhiUyiYAGTBIH.png
从这次的输出可以看到,nslookup 连接环回地址(127.0.0.1 和 ::1)的 53 端口失败。这里就有问题了,为什么会去连接环回地址,而不是 114.114.114.114 呢?
你可能已经想到了症结所在——有可能是因为没有(容器中)配置 DNS 服务器。那我们就执行下面的命令确认一下:
/# cat /etc/resolv.conf
果然,这个命令没有任何输出,说明容器里的确没有配置 DNS 服务器。到这一步,很自然的,我们就知道了解决方法。在 /etc/resolv.conf 文件中,配置上 DNS 服务器就可以了。你可以执行下面的命令,在配置好 DNS 服务器后,重新执行 nslookup 命令。自然,我们现在发现,这次可以正常解析了:
#echo "nameserver 114.114.114.114" > /etc/resolv.conf/
#nslookup time.geekbang.org
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
Name: time.geekbang.org
Address: 39.106.233.176
也可能是因为域名解析花费的时间太久,这是因为DNS缓存失效
如果DNS解析没有问题,则得到IP 47.103.184.80
ping 47.103.184.80 如果不通
(这里需要注意的是,ping不通,也不可能是网络环境屏蔽了icmp报文,这个是直接走的ip)
则使用tcpdump:
tcpdump -nn udp port 53 or host 47.103.184.80
(-nn ,表示不解析抓包中的域名(即不反向解析)、协议以及端口号。udp port 53 ,表示只显示 UDP 协议的端口号(包括源端口和目的端口)为 53 的包。host 35.190.27.188 ,表示只显示 IP 地址(包括源地址和目的地址)为 35.190.27.188 的包。这两个过滤条件中间的“ or ”,表示或的关系,也就是说,只要满足上面两个条件中的任一个,就可以展示出来。)
输出如下:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:02:31.100564 IP 172.16.3.4.56669 > 114.114.114.114.53: 36909+ A? geektime.org. (30)
14:02:31.507699 IP 114.114.114.114.53 > 172.16.3.4.56669: 36909 1/0/0 A 35.190.27.188 (46)
14:02:31.508164 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 1, length 64
14:02:31.539667 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 1, length 64
14:02:31.539995 IP 172.16.3.4.60254 > 114.114.114.114.53: 49932+ PTR? 188.27.190.35.in-addr.arpa. (44)
14:02:36.545104 IP 172.16.3.4.60254 > 114.114.114.114.53: 49932+ PTR? 188.27.190.35.in-addr.arpa. (44)
14:02:41.551284 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 2, length 64
14:02:41.582363 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 2, length 64
14:02:42.552506 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 3, length 64
14:02:42.583646 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 3, length 64
从第三行开始,就是抓取到的网络包的输出。这些输出的格式,都是 时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息(这是最基本的格式,可以通过选项增加其他字段)
两条反向地址解析 PTR 请求,就比较可疑了。因为我们只看到了请求包,却没有应答包。仔细观察它们的时间,你会发现,这两条记录都是发出后 5s 才出现下一个网络包,两条 PTR 记录就消耗了 10s。
其实我们也就找到了 ping 缓慢的根源,正是两次 PTR 请求没有得到响应而超时导致的。PTR 反向地址解析的目的,是从 IP 地址反查出域名,但事实上,并非所有 IP 地址都会定义 PTR 记录,所以 PTR 查询很可能会失败。
在你使用 ping 时,如果发现结果中的延迟并不大,而 ping 命令本身却很慢,不要慌,有可能是背后的 PTR 在搞鬼。知道问题后,解决起来就比较简单了,只要禁止 PTR 就可以
还可以使用route命令 :
Linux系统的route命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台网关的IP地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。
所以ping 不通目的ip地址可能是没有设置默认路由。
- 找出当前 CPU 占用最多的进程
方法一:
ps aux | sort -k3nr | head -1//如果是最高的10个,1改成3即可
//a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分
//k代表从根据哪一个关键词排序,后面的数字3表示按照第三列排序;n指代numberic sort,根据其数值排序;r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小
方法二:
top
然后按下P(是大写的P)
- 找出当前内存占用最多的进程
方法1:
ps aux | sort -k4nr | head -1
方法2:top (然后按下M,注意大写)
PID:进程的ID USER:进程所有者 PR:进程的优先级别,越小越优先被执行
NInice:值 VIRT:进程占用的虚拟内存 RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率 %MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
方法3:按内存大小排序,打印出所有的进程
ps aux --sort -rss
- 在一个文本文件中,过滤掉包含 “ab” 的行,输出剩余的内容到另外的文件。
grep -v ab file1 > file2 //是将含有 ab 字符的那一行