zoukankan      html  css  js  c++  java
  • 查看程序在运行过程中使用到的文件

    查看程序在运行过程中使用到的文件

    查看程序在运行过程中使用到的文件

    1 场景

    试想这个场景

    • 写了一个脚本在运行
    • 脚本运行时间需要很长,并且你不能停下脚本(会有中断问题)
    • 这时候你想知道自己的脚本进程在处理什么文件,在做什么事情,该怎么办呢?

    2 想知道进程在读写什么文件

    首先 使用 ps aux 或者 ps ef 查看自己的进程 id

    然后到 /proc/ 目录中下查看相应进程的进程运行数据

    ps aux 数据

    wudanya+  3166  0.0  0.0 107956   616 ?        S    22:04   0:00 sleep 180
    wudanya+  3189  0.0  0.0 107956   616 pts/3    S+   22:06   0:00 sleep 1000000
    wudanya+  3191  0.0  0.0 112728   972 pts/5    R+   22:06   0:00 grep --color=auto sleep
    

    第二列就是每个进程的 pid ,在系统中是唯一的

    查看 /proc/[pid]/fd 目录

    2020-09-10_00-02-12_screenshot_副本.jpg

    如图, 可以看到,进程打开了 4 个文件描述符

    其中 0、1、2 分别代表 标准输入、输出、错误(规定)

    25 代表的是一个虚拟终端

    3 打开的是一个文件

    这样就可以知道你打开的是什么文件了

    是不是很简单呢

    3 我怎么知道文件正在读取还是写入呢

    这还用问,当然是看代码了

    开个玩笑

    咱们这次是说不用看代码就可以看出来在写入什么文件,在读取什么文件

    3.1 lsof -p pid

    [wudanyang@bogon ~]$ lsof -p 3352
    COMMAND  PID      USER   FD      TYPE DEVICE  SIZE/OFF     NODE NAME
    tail    3352 wudanyang  cwd       DIR  253,0      4096  4731473 /home/wudanyang
    tail    3352 wudanyang  rtd       DIR  253,0       240       64 /
    tail    3352 wudanyang  txt       REG  253,0     66824 12829983 /usr/bin/tail
    tail    3352 wudanyang  mem       REG  253,0 106075056 12587626 /usr/lib/locale/locale-archive
    tail    3352 wudanyang  mem       REG  253,0   2156160    44517 /usr/lib64/libc-2.17.so
    tail    3352 wudanyang  mem       REG  253,0    163400    44510 /usr/lib64/ld-2.17.so
    tail    3352 wudanyang    0u      CHR  136,3       0t0        6 /dev/pts/3
    tail    3352 wudanyang    1u      CHR  136,3       0t0        6 /dev/pts/3
    tail    3352 wudanyang    2u      CHR  136,3       0t0        6 /dev/pts/3
    tail    3352 wudanyang    3r      REG  253,0         0  5171247 /home/wudanyang/a
    tail    3352 wudanyang    4r  a_inode   0,10         0     5338 inotify
    tail    3352 wudanyang   25u      CHR    5,2       0t0     7061 /dev/ptmx
    

    前三列可以不用管,第四列是打开的描述符,可以看到

    FD:

    u 读/写
    r 只读
    w 只写
    W 获得写锁

    OK,搞定,可以看到咱们程序打开了一个 /home/wudanyang/a 文件只读描述符

    3.2 使用 strace -p pid 看一下系统调用

    2020-09-10_00-03-55_screenshot.png

    通过系统调用查看一下当前正在执行的系统调用,也可以看到是 读还是写。上图中是一个读取的系统调用,参数是文件描述符 4

    4 总结

    • 日常工作中会经常遇到这种需求,总结一下
    • /proc/[pid]/ 不止有 fd ,可以继续深入了解一下

    ===

    作者: 吴丹阳 https://www.cnblogs.com/wudanyang

    更新时间: 2020-09-10 Thu 00:09

    Emacs 28.0.50 (Org mode 9.3.7)

    ===

    天行健,君子以自强不息。

    地势坤,君子以厚德载物。

    ===

  • 相关阅读:
    如何使用Linux命令实时查看最新的日志信息
    什么是缺陷(bug)
    APP 崩溃测试点小结
    软件测试之权限测试
    web安全测试之 xss攻击
    URL详谈
    随机生成名字或短句代码机
    JAVA环境变量配置
    Properties类与读取properties文件
    JAVA 打印九九乘法表
  • 原文地址:https://www.cnblogs.com/wudanyang/p/13643060.html
Copyright © 2011-2022 走看看