Linux 问题

  • 如何以只读模式,用 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.1148.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 字符的那一行
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值