Linux Troubleshooting Cheatsheet: strace, htop, lsof, tcpdump, iftop & sysdig
By Phil Rzewski on April 13, 2016
该Sysdig速查表是Linux管理员可以用来深入了解其服务器的命令行的重要指南。无论您是一个月的管理员还是20年的管理员,您都肯定使用了所有(如果不是全部)这些工具来解决问题。因为我们喜欢Sysdig(自然而然!),所以我们还将这些常见操作中的每一个都翻译成sysdig命令行或csysdig。
我们并没有尝试涵盖手册页中的所有选项(本来会使许多深奥的,很少使用的开关无聊的报道),而是从当您搜索诸如“ strace示例”,“ htop示例”等等。
您是否有未在此处列出的收藏夹?让我们知道,我们将在以后的文章中包含它们。
strace
在许多并排比较中,strace和sysdig之间存在一个细微的区别,这很明显:许多最简单的strace示例都包含命令行,这些命令行以“一次性”操作的形式执行和跟踪。另一方面,Sysdig的理念有所不同,它既可以实时监视实时事件,也可以分析先前保存到文件中的捕获数据。值得庆幸的是,正如您很快就会看到的,Sysdig丰富的过滤选项提供了旋钮,可以监视特定的单次执行。
操作 | STRACE | SYSDIG | 注意 |
---|---|---|---|
跟踪命令的执行 | strace who |
sysdig proc.name=who |
strace一次性显示此处显示的who命令,而Sysdig正在监视who的执行情况。使用Sysdig的过滤来进一步隔离特定的运行,例如: sysdig proc.name=who and proc.ppid=534 这将监视谁将在您确定具有534的PID的外壳中运行。 |
仅在进行某些/特定系统调用时跟踪 | strace -e open who strace -e trace=open,read who |
sysdig evt.type=open and proc.name=who sysdig "evt.type in (open,read) and proc.name=who" |
|
将跟踪保存到文件 | strace -o output.txt who |
sysdig -w output.scap proc.name=who |
使用strace,生成的文件包含的内容与交互式运行时在屏幕上显示的内容相同。使用Sysdig,您将获得原始的,可重复使用的捕获文件,从而可以使用以下方式查看文本输出: sysdig -r output.scap 您还可以以此为基础来应用过滤器或在重新访问原始事件时要应用的任何其他Sysdig功能。 。 |
观看PID = 1363的运行过程 | strace -p 1363 |
sysdig proc.pid=1363 |
|
为跟踪的每条输出线打印一个时间戳 | strace -t who |
sysdig proc.name=who |
Sysdig默认情况下会打印时间戳。 |
打印系统调用的相对时间 | strace -r who |
sysdig -tD proc.name=who |
Sysdig通过-t选项提供了几种表示时间戳的方法。 |
生成系统调用的批处理统计报告 | strace -c who |
sysdig -w output.scap proc.name=who 对于一次性批处理文本报告: sysdig -r output.scap -c topscalls -c topscalls_time 或对于允许进一步深入研究的交互式报告: csysdig -r output.scap -v syscalls |
Sysdig的默认行为针对事件数据发生时的情况进行了优化,而不是“批处理”报告。这就是为什么在此处分两步完成Sysdig等效项的原因。 |
生成系统调用的实时实时统计报告,以PID = 1363表示正在运行的进程 | N / A | csysdig -v syscalls proc.pid=1363 |
尽管strace可以实时显示单个事件,或者提供单个批处理报告来执行命令,但是csysdig的视图提供了独特的功能来显示实时的定期报告 |
HTOP
由于htop是一种实时,交互式,诅咒风格的工具,因此我们将其与实时,交互式,诅咒风格的csysdig进行比较。
对于初学者来说,这两种工具都使用相同的方法,即通过上/下/左/右箭头以及PgUp / PgDn导航实时表。对于影响单个过程的操作(杀死,重制等等),假定您已使用这些控件首先突出显示特定过程。
操作 | HTOP | CSYSDIG | 注意 |
---|---|---|---|
根据表的列更改排序顺序 | 按F6 ,< 或> ,然后按名称选择一列,或 按M ,P 或T 通过内存,处理器使用,或时间排序 按I 反转排序顺序 |
按F9 或> ,然后按名称选择列,或 按按shift<1-9> 任何列进行排序 n ,然后反复按以反转排序顺序,或 在列标题上单击鼠标左键 |
|
杀死进程 | 按F9 或k |
按k |
|
Renice一个过程 | 按F7 或] 将nice值降低1 按F8 或[ 将nice值提高1 |
按下] 将nice值减小1 按下[ 将nice值增大1 |
这说明自定义Sysdig很容易。我在初次撰写本文时注意到csysdig缺少这样的一些次要功能,因此我借此机会学习了编写/修改Chisels的难易程度,然后提出了我的改进作为Pull Request。你也可以做到的! |
仅显示由名为“ phil”的用户启动的进程 | 按u ,然后从列表中 选择用户名phil |
启动为: csysdig user.name=phil 或在默认“流程”视图顶部的Filter: 内部单击鼠标csysdig ,然后附加and user.name=phil 到当前过滤器文本 |
|
将输出刷新间隔更改为每5秒一次 | 启动为: htop -d 50 |
启动为: csysdig -d 5000 |
如您所见,htop的工作单位为十分之一秒,而csysdig的工作单位为毫秒。 |
在进程上启动系统调用跟踪 | 按s 开始strace |
按下F6 开始sysdig |
|
列出流程的打开文件 | 按下l 即可执行一次lsof |
按f 运行一次性lsof的或者看到实时更新的进程所使用的文件/目录的报告,按向下钻取到具体的过程Enter ,然后按F2 选择,如查看Files ,File Opens List 或Directories 。 |
有关lsof 最近如何将一次性添加为增强功能的信息,请参见上面的“简化流程”说明。 |
遵循一个过程,以便即使列表中的顺序发生更改,该过程仍会突出显示 | 按 F |
默认行为是始终遵循突出显示的过程 |
lsof
操作 | LSOF的 | CSYSDIG | 注意 |
---|---|---|---|
列出属于所有活动进程的所有打开文件 | lsof |
sysdig -c lsof |
|
列出已打开特定文件/ var / log / syslog的进程 | lsof /var/log/syslog |
sysdig -c lsof "fd.name=/var/log/syslog" |
|
列出已在目录/ var / log下打开文件的进程 | lsof +d /var/log |
sysdig -c lsof "fd.directory=/var/log" |
|
列出由名为“ sshd”的进程打开的文件 | lsof -c sshd |
sysdig -c lsof "proc.name=sshd" |
|
列出由名为“ phil”的特定用户打开的文件 | lsof -u phil |
sysdig -c lsof "user.name=phil" |
|
列出所有人打开的文件,但名为“ phil”的用户除外 | lsof -u ^phil |
sysdig -c lsof "user.name!=phil" |
|
列出具有PID = 1081的特定过程的所有打开的文件 | lsof -p 1081 |
sysdig -c lsof "proc.pid=1081" |
|
列出用户“ phil”或名为“ sshd”的进程(或逻辑)打开的所有文件 | lsof -u phil -c sshd |
sysdig -c lsof "'user.name=phil or proc.name=sshd'" |
注意Sysdig过滤器使用两层引号。 |
列出由“ sshd”进程为用户“ phil”打开的所有文件(AND逻辑) | lsof -u phil -c sshd -a |
sysdig -c lsof "'user.name=phil and proc.name=sshd'" |
注意Sysdig过滤器使用两层引号。 |
观察基于实时活动的打开文件的重复报告 | 使用以下之一启用重复模式: lsof -r lsof +r |
可以使用实时/交互式csysdig视图获得类似的实时数据,如下所示: csysdig -v files csysdig -v file_opens |
|
列出所有网络连接 | lsof -i |
sysdig -c lsof "fd.type=ipv4" |
|
列出特定进程使用PID = 1014的网络连接 | lsof -i -a -p 1014 |
sysdig -c lsof "'fd.type=ipv4 and proc.pid=1014'" |
注意Sysdig过滤器使用两层引号。 |
列出正在端口22上侦听的进程 | lsof -i :22 |
sysdig -c lsof "'fd.port=22 and fd.is_server=true'" |
注意Sysdig过滤器使用两层引号。 |
列出所有TCP或UDP连接 | lsof -i tcp lsof -i udp |
sysdig -c lsof "fd.l4proto=tcp" sysdig -c lsof "fd.l4proto=udp" |
tcpdump
tcpdump完全专注于网络流量,而网络流量只是Sysdig涵盖的子集。许多tcpdump用例都涉及过滤,而tcpdump使用特定于网络的BPF过滤器,而Sysdig使用其自身更广泛的Sysdig过滤。两种方法在许多方面看起来都很相似,但是随着对高级过滤需求的不断发展,您将需要并排查看每个文档。另外,由于在Linux中所有内容都是文件,因此您会注意到下面的Sysdig筛选示例全部利用“通过文件描述符进行网络连接”方法。
操作 | TCPDUMP的 | CSYSDIG | 注意 |
---|---|---|---|
从特定接口eth0(192.168.10.119)捕获数据包 | tcpdump -i eth0 |
sysdig fd.ip=192.168.10.119 |
Sysdig当前没有基于命名接口的过滤,但是此处显示了等效于通过IP地址的过滤。 |
仅捕获100个数据包 | tcpdump -c 100 |
sysdig -n 100 fd.type=ipv4 |
|
以ASCII显示捕获的数据包 | tcpdump -A |
sysdig -A fd.type=ipv4 |
|
以十六进制和ASCII显示捕获的数据包 | tcpdump -XX |
sysdig -X fd.type=ipv4 |
|
捕获数据包数据,将其写入文件 | tcpdump -w saved.pcap |
sysdig -w saved.scap fd.type=ipv4 |
Sysdig文件格式能够保存事件数据,而不仅仅是网络数据包(例如,系统调用)。 |
从文件中读取保存的数据包数据 | tcpdump -r saved.pcap |
sysdig -r saved.scap |
|
仅捕获大于/小于1024字节的数据包 | tcpdump greater 1024 tcpdump less 1024 |
sysdig "fd.type=ipv4 and evt.buflen > 1024" sysdig "fd.type=ipv4 and evt.buflen < 1024" |
greater/less tcpdump中 的选项引用了整个数据包长度,而evt.buflen Sysdig中的选项则相对于有效负载大小。 |
仅捕获UDP或TCP数据包 | tcpdump udp tcpdump tcp |
sysdig fd.l4proto=udp sysdig fd.l4proto=tcp |
请注意,fd.type=ipv4 由于我们在此处使用其他仅用于网络的过滤器,因此我们无需明确包含。 |
仅捕获去往/来自特定端口的数据包 | tcpdump port 22 |
sysdig fd.port=22 |
请注意,fd.type=ipv4 由于我们在此处使用其他仅用于网络的过滤器,因此我们无需明确包含。 |
捕获特定目标IP和端口的数据包 | tcpdump dst 54.165.81.189 and port 6666 |
sysdig fd.rip=54.165.81.189 and fd.port=6666 |
请注意,fd.type=ipv4 由于我们在此处使用其他仅用于网络的过滤器,因此我们无需明确包含。 |
iftop
由于iftop是实时,交互式,诅咒风格的工具,因此我们将其与实时,交互式,诅咒风格的csysdig进行比较。另外,与tcpdump一样,iftop使用BPF过滤器。有关过滤差异的更多详细信息,请参见tcpdump上一节的前一介绍。
操作 | IFTOP的 | CSYSDIG | 注意 |
---|---|---|---|
显示主机对之间的当前带宽使用情况表 | iftop |
以以下方式启动: csysdig -v connections 或F2 从内部csysdig 按更改视图,然后向上箭头选择Connections |
缺省情况下,iftop仅监视它找到的第一个接口,而缺省情况下,csysdig监视整个主机上的流量。 |
打开网络端口的显示 | 启动方式: iftop -P 或p 从内部按iftop |
默认行为是始终显示端口 | |
仅观察eth0接口(192.168.10.119)的流量 | 启动为: iftop -i eth0 |
作为启动: csysdig -v connections fd.ip=192.168.10.119 或者鼠标点击Filter: 来自内部csysdig ,然后追加和fd.ip=192.168.10.119 现有的过滤器文本 |
sysdig / csysdig当前没有基于命名接口的过滤,但是此处显示了等效于通过IP地址的过滤。 |
解析DNS名称 | 按n 从内iftop 到切换分辨率,显示所有主机 |
n 从内部 按csysdig 以nslookup 在当前突出显示的远程主机上运行 |
|
根据表的列更改排序顺序 | 按下以按目的地排序 | 按F9 或> ,然后按名称选择列,或 按按shift <1-9> 任何列进行排序 n ,然后反复按以反转排序顺序,或 在列标题上单击鼠标左键 |
|
过滤以仅显示去往/来自IP地址54.84.222.1的流量 | 启动为: iftop -f "host 54.84.222.1" |
启动为: csysdig -v connections fd.ip=54.84.222.1 或Filter: 在csysdig中单击鼠标,然后附加and fd.ip=54.84.22.1 到现有过滤器文本 |
|
暂停显示 | 按 P |
按 p |
|
滚动显示 | 按j 向上滚动 按k 向下滚动 |
按Up/Down/Left/Right 箭头或PgUp/PgDn 在表格中滚动 |
sysdig / csysdig不仅可以滚动浏览单个表,还可以深入“连接视图”以查看其他分组(例如,每个容器或每个线程)中的数据。 |
Linux故障排除备忘单:strace,htop,lsof,tcpdump,iftop和sysdig https://t.co/XeIeAwwj9i
— Sysdig(@sysdig)
2016年4月14日
Sysdig备忘单致谢
作者要感谢thegeekstuff.com,因为上表中使用示例填充的大多数文章都是在其站点上找到的。
您要下载该备忘单的PDF版本吗? 在这里抓住它。