前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >df 和 ls 命令执行夯主

df 和 ls 命令执行夯主

作者头像
张琳兮
发布于 2020-05-25 09:18:09
发布于 2020-05-25 09:18:09
2.1K00
代码可运行
举报
文章被收录于专栏:首富手记首富手记
运行总次数:0
代码可运行

df 和 ls 命令执行夯主

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
作者:张首富
时间:2020-05-21
w x:y18163201

原因

今天一个朋友问我一个问题,他的描述如下:

1,ls / 执行这个命令的时候卡住,什么反应都没有,但是 ls 其他目录的时候就没有事情 2,df 查看文件挂载的时候也卡住, 3,我什么都没干啊,就做了一个 ISCSI

其实他说第二点问题的时候我就已经猜到问题所在了,那不就是远程挂载的磁盘非正常的掉了,然后就会造成这个问题。但是他说 ISCSI 这个玩意的时候我不知道是啥,于是查了一下,有兴趣的同学可以看看这是:https://zhuanlan.zhihu.com/p/60986068,看的出来他是一个网络存储,那么就更加坚定我的想法了,开始指挥解决问题

解决办法

问题原因大概猜想出来之后,就是开始解决问题了。

找到是哪个挂载点失效了

我们可以使用此命令来查找挂载点哪个地方失效了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strace df -Th

执行卸载

通过上面命令我们能找到是哪个挂载点失效了,我们可以使用下面命令先尝试卸载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
umount -lf 有问题的挂载点

然后等个1~2 分钟看看效果,-f 是强制卸载的意思。

如果使用这个命令还是解决不了问题,那么我们先确认有哪些进程在占用这个挂载点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fuser -cu 挂载点

会得到进程 ID,和进程命令,看看此进程是否能正常杀掉,如果可以我们手工停止这个进程,然后进行卸载,或者直接使用下面命令进行卸载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fuser -ck 挂载点

strace 工具实现原理

什么是 strace

它是一个具有 Linux 传统命令行界面的诊断、调试和指令性用户空间的使用程序。它用于监控和篡改进程与 Linux 内核之间的交互,包括系统调用、信号传递和进程状态的变化。strace 的所有操作都是通过内核的ptrace功能来实现的。项目主页是:https://github.com/strace/strace

关于 ptrace 相关知识可以阅读:

main ptrace

Linux 沙箱之 ptrace

https://jin-yang.github.io/post/linux-ptrace-api-introduce.html

使用 strace

最简单的 strace 命令的用法就是: strace PROG;PROG 就是要执行的程序(linux 命令)。strace 命令执行的结果就是按照调用顺序打印出所有的系统调用,包括函数名、参数列表以及返回值。

使用 strace 跟踪一个进程的系统调用的基本流程如下图:

(此图片来源网络)

从图中可以看出strace做了以下几件事情:

  1. 设置SIGCHLD 信号的处理函数,这个处理函数只要不是SIG_IGN即可。由于子进程停止后是通过SIGCHLD信号通知父进程的,所以这里要防止SIGCHLD信号被忽略。
  2. 创建子进程,在子进程中调用ptrace(PTRACE_TRACEME,0L, 0L, 0L)使其被父进程跟踪,并通过execv函数执行被跟踪的程序。
  3. 通过wait()等待子进程停止,并获得子进程停止时的状态status。
  4. 通过子进程的状态查看子进程是否已正常退出,如果是,则不再跟踪,随后调用ptrace发送PTRACE_DETACH请求解除跟踪关系。
  5. 子进程停止后,打印系统调用的函数名、参数和返回值。具体流程见图2。
  6. 通过PTRACE_SYSCALL让子进程继续运行,由于这个请求会让子进程在系统调用的入口处和系统调用完成时都会停止并通知父进程,这样,父进程就可以在系统调用开始之前获得参数,结束之后获得返回值。

在系统调用的入口和结束时子进程停止运行时,这时父进程认为子进程是因为收到SIGTRAP信号而停止的。所以父进程在wait()后可以通过SIGTRAP来与其他信号区分开。

Strace中为每个要跟踪的进程维护了一个TCB(Trace Control Block)结构,定义如下。它保存了当前发生的系统调用的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* Trace Control Block */
struct tcb {
    int flags;    /* See below for TCB_ values */
    int pid;      /* Process Id of this entry */
    int qual_flg; /* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW*/
    int u_error;  /* Error code */
    long scno;    /* System call number */
    long u_arg[MAX_ARGS];    /* System call arguments */
    long u_rval;      /* Return value */
    int curcol;       /* Output column for this process */
    FILE *outf;       /* Output file for this process */
    const char *auxstr;/*Auxiliary info from syscall (see RVAL_STR) */
    const struct_sysent *s_ent;/* sysent[scno] or dummy struct for bad scno */
    struct timeval stime;/*System time usage as of last process wait */
    struct timeval dtime;    /* Delta for system time usage */
    struct timeval etime;    /* Syscall entry time */
              /* Support fortracing forked processes: */
    long inst[2];     /* Saved clone args (badly named) */
};

上面已经提到,子进程会在系统调用前后各停止一次,所以打印系统调用信息时分为两个阶段:在系统调用开始时可以获取系统调用号和参数,在系统调用结束时可以获取系统调用的返回结果。通过给tcb结构的flags字段清除和添加TCB_INSYSCALL标志位来区分系统调用的开始和结束。

例如编写一个使用printf打印“Hello world”的程序hello.c,使用strace跟踪该程序的系统调用可以看到如下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ./strace ./hello
execve("./hello ", ["./hello "], [/* 7 vars */])= 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,-1, 0) = 0x2aaad000
stat("/etc/ld.so.cache", 0x7faf4ca8)    = -1 ENOENT (No such file or directory)
open("/tmp/libgcc_s.so.1", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1565445, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,-1, 0) = 0x2aaae000
read(3,"\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\263\200\0\0\0004"...,4096) = 4096
mmap(NULL, 241664, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =0x2aabe000
mmap(0x2aabe000, 169308, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED,3, 0) = 0x2aabe000
mmap(0x2aaf8000, 2400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED,3, 0x2a000) = 0x2aaf8000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/tmp/libc.so.0", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=431732, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,-1, 0) = 0x2aaae000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\252\200\0\0\0004"...,4096) = 4096
mmap(NULL, 471040, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =0x2aaf9000
mmap(0x2aaf9000, 380336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED,3, 0) = 0x2aaf9000
mmap(0x2ab65000, 8088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED,3, 0x5c000) = 0x2ab65000
mmap(0x2ab67000, 19376, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ab67000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/tmp/libc.so.0", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=431732, ...}) = 0
close(3)                                = 0
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755,st_size=22604, ...}) = 0
mprotect(0x2ab65000, 4096, PROT_READ)   = 0
mprotect(0x2aabc000, 4096, PROT_READ)   = 0
ioctl(0, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
write(1, "Hello world\n", 12Hello world
)           = 12
exit(0)                                 = ?
+++ exited with 0 +++

从结果可以看出,执行该程序调用了很多系统调用,并最终通过write系统调用打印出“Hello world”。

跟踪一个正在运行的进程,使用-p选项加上进程的pid。

跟踪某个特定的系统调用,使用-e选项加上系统调用名。

例如,跟踪进程727的epoll_wait系统调用:strace -e epoll_wait -p 727

参考:

https://blog.csdn.net/jasonchen_gbd/article/details/44044539

https://blog.csdn.net/shandianling/article/details/17033299

http://godorz.info/2011/02/process-tracing-using-ptrace/(值得一看)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十个例子让你了解 strace 的使用技巧
tcpdump 作为计算机网络排查的一大神器,掌握了上文所说的技巧,可以让你随时随地得心应手的掌握网络应用的一举一动。
用户3147702
2022/06/27
4.9K0
十个例子让你了解 strace 的使用技巧
Linux 命令(137)—— strace 命令
strace 命令是一个集诊断、调试、统计于一体的工具,我们可以使用 strace 对程序的系统调用和信号传递的跟踪结果来对程序进行分析,以达到解决问题或者是了解程序工作过程的目的。当然strace 与专业的调试工具比如说 gdb 之类的是没法相比的,因为它不是一个专业的调试器。
恋喵大鲤鱼
2020/04/13
8.5K0
sqlplus执行错误的问题探究
今天碰到个很诡异的问题,在装了Oracle Clinet的机器,不同路径下执行指令sqlplus,回显不同。
bisal
2020/07/25
9050
线程的创建以及线程的本质
上节详细学习了进程的创建,通过实例学习了fork和vfork的区别。本节将学习线程的创建,只涉及应用层的线程,内核线程的创建在后面学习。
DragonKingZhu
2020/03/24
1.7K0
线程的创建以及线程的本质
无法获取指向控制台的文件描述符 (couldn't get a file descriptor referring to the console)
最近收拾东西,从一堆杂物里翻出来尘封四年多的树莓派 3B 主机来,打扫打扫灰尘,接上电源,居然还能通过之前设置好的 VNC 连上。欣慰之余,开始 clone 我的 git 项目,为它们拓展一个新的平台。在执行 cnblogs 项目 (参考《博客园排名预测 》) 对应的绘图命令时,趋势图、预测图是生成了,但没有自动打开图片,这个问题经过一番探索居然解决了,这篇文章就来分享一下解决问题的过程。
海海
2022/08/31
3.7K0
无法获取指向控制台的文件描述符 (couldn't get a file descriptor referring to the console)
ls 不显示,rm 删不掉,怎么办?
有个叫atest的东西 ls -l atest 查不出来是什么 下面删也删不掉 但是可以用mv改名字,它放在/目录下,用ls /导致不能显示 如果操作,请大侠指点, 顺便问下什么时候会导致ls /   不显示,谢谢! # s
三杯水Plus
2018/11/14
1.1K0
这条命令有可能断送DBA职业生涯,我今天真的执行了
这个是从库,没有读业务和其他下游同步,风险可控。但是大家还是要谨慎。我执行这个命令是因为我搜到的菜鸟教程的split命令案例错误导致我生成了大量小文件。没想到大名鼎鼎的菜鸟教程也会有问题,大家还用man或者tldr查看帮助手册吧。
DBA札记
2024/06/03
1300
这条命令有可能断送DBA职业生涯,我今天真的执行了
futex验证_fulvic
#include <semaphore.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
全栈程序员站长
2022/11/08
3090
Swoole v4.7 版本预览之支持 c-ares
c-ares 是一个异步 DNS 解析库。它适用于需要在不阻塞的情况下执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。
沈唁
2021/07/23
8140
使用golang的net包进行域名解析过程分析
我们都知道,在计算机的世界,建立连接都是需要依靠五元组的(源ip,源端口,目的ip,目的端口,协议),而在实际用户使用过程中,浏览器会帮我们识别和管理源ip和端口以及协议(http,https),协议确定后其实目的端口也就确定了(80或443). 因此整个DNS系统要解决的问题就是将用户在浏览器中输入的域名最终转换成可识别的目的ip,进而进行连接通信。下面以一个简单例子来分析下dns解析的过程.
BGBiao
2019/09/11
13.6K0
Linux系统下刨析hello world背后的秘密
linux系统上使用gcc生成可执行程序:gcc -g -W helloworld.c -o helloworld
Linux兵工厂
2023/02/28
6380
Linux系统下刨析hello world背后的秘密
CVE-2021-44731 linux snap 本地提权漏洞分析
Snap是Canonical为使用Linux内核的操作系统开发的软件打包和部署系统。这些包(称为 snaps)和使用它们的工具 snapd 可在一系列 Linux 发行版中工作。
枪哥四海为家
2022/03/05
3.5K0
CVE-2021-44731 linux snap 本地提权漏洞分析
Linux 进程管理
进程是 UNIX/Linux 用来表示正在运行的程序的一种抽象概念,所有系统上面运行的的数据都会以进程的形态存在。
用户1679793
2020/05/06
7.1K0
故障分析 | 哪些情况下 MySQL 配置文件会被截断?
作者:龚唐杰,爱可生 DBA 团队成员,主要负责 MySQL 技术支持,擅长 MySQL、PG、国产数据库。
爱可生开源社区
2024/10/10
1760
故障分析 | 哪些情况下 MySQL 配置文件会被截断?
Swoole 4.4:支持 CURL 协程化
在4.4之前的版本中,Swoole一直不支持CURL协程化,在代码中无法使用curl。由于curl使用了libcurl库实现,无法直接hook它的socket,4.4版本使用Swoole\Coroutine\Http\Client模拟实现了curl的API,并在底层替换了curl_init等函数的C Handler。
猿哥
2019/06/12
6060
tools-tcp
如在我的电脑上strace -o 1.txt pkill goldendict,strace就给出了3287行的信息。。。如果加上参数-e trace=process,那么就只有4行:
Heeler-Deer
2023/02/22
4750
分析运行中的 Python 进程
在 Java 中打印当前线程的方法栈,可以用 kill -3 命令向 JVM 发送一个 OS 信号,JVM 捕捉以后会自动 dump 出来;当然,也可以直接使用 jstack 工具完成,这些方法好几年前我在这篇性能分析的文章中介绍过。这样的需求可以说很常见,比如定位死锁,定位一个不工作的线程到底卡在哪里,或者定位为什么 CPU 居高不下等等问题。
四火
2022/07/19
9320
Linux 性能调优之CPU上下文切换
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2024/09/12
8660
Linux 性能调优之CPU上下文切换
Linux 内核监控在 Android 攻防中的应用
在日常分析外部软件时,遇到的反调试/反注入防护已经越来越多,之前使用的基于 frida 的轻量级沙盒已经无法满足这类攻防水位的需要,因此需要有一种更加深入且通用的方式来对 APP 进行全面的监测和绕过。本文即为对这类方案的一些探索和实践。
evilpan
2023/02/12
3.3K0
Linux 内核监控在 Android 攻防中的应用
POSIX共享内存
几种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,即进程间的通信必须借助内核来传递。如下图所示:
WindSun
2019/08/31
3K1
POSIX共享内存
相关推荐
十个例子让你了解 strace 的使用技巧
更多 >
LV.2
南京硅基科技智能有限公司运维工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验