Linux下,如何监控某个进程到底向哪个地址发起了网络调用
Linux下,如何监控某个进程到底向哪个地址发起了网络调用
有时候,有些应用,比如idea,你发起某个操作时,其底层会去请求网络,获取一些数据。
但是不知道,请求了什么地址。举个例子,在idea中,maven管理的java工程,你在reimport的时候,肯定会去下载依赖,但是,有时候感觉配置的私服没生效,好像,请求还是去maven中央仓库下载。
怎么确定是不是真的去了maven中央仓库下载呢?有证据吗?
此时有什么好办法呢?如果不用点什么工具,还真没什么好办法。
再比如,我这里有一个linux上运行的java程序,我调用某个接口的时候,其会请求某个服务,但是现在,日志里没记录调用日志。那怎么知道是代码没走到,还是调用了呢,如果调用了,真实请求的地址是哪里呢?
netstat:比较简陋的方式
一般,一个程序刚调用完远程服务时,其socket的状态为time_wait,此时,和请求之前比,看看发生了什么变化。
netstat -antp |grep pid
比如,请求前,我java应用的网络连接如下:

请求后,网络连接如下:

pid和进程id的关系
一般进程id,假设为10095,因为这是个java进程,是多线程的,我们使用查看其内部的线程:
top -H -p 10095
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19823 root 20 0 9999.0m 1.5g 14632 S 1.7 9.5 67:25.37 java
10215 root 20 0 9999.0m 1.5g 14632 S 0.3 9.5 1:21.68 java
10095 root 20 0 9999.0m 1.5g 14632 S 0.0 9.5 0:00.00 java
发现其中,真就有一个线程id是10095。
这里的规律是,假设进程id为A,那么线程中,也有一个id相同的线程。
strace使用说明
概述
该命令,主要监控一个进程在运行过程中,发起了哪些系统调用;如果收到其他进程发送的signal,也可以监控。
功能非常强大,因为不论是网络发送,监听,请求,都是调用操作系统的函数,比如listen、connect等;因此,可以监控网络调用,可以将方法调用时的入参、出参、花费时间等,都打印出来,或者打印到文件。
同时,可以监控文件,比如:
open("/dev/null", O_RDONLY) = 3
这个就表示,调用open函数,参数为/dev/null,O_RDONLY,返回值为3.
查看进程的文件相关的系统调用
strace -t -p 10095 -q -f -s 10000 -e trace=file
-t: 打印调用时间
-p : 指定pid
-q : 压制attach、detach的消息,不然的话,attach到进程时,会打印一句提示;结束的时候,也会打印一堆提示。
-f: 不只是跟踪当前进程id对应的线程id,还要跟踪该pid内的全部线程,对于java这类多线程程序,尤其有用
-s strsize
Specify the maximum string size to print (the default is 32). Note that filenames are not considered strings and are always printed in full.
该参数的作用不便描述,可以看后面的例子。
-e trace=file
监控文件相关的系统调用
监控线程相关操作
-e trace=process
Trace all system calls which involve process management. This is useful for watching the fork, wait, and exec steps of a process.
监控网络请求
strace -p 10095 -q -f -e trace=network
效果如下:

如果要看到具体信息:
strace -p 10095 -q -f -s 10000 -e trace=network

现在就可以看到了。
获得比平时,更清晰的信息:
[root@localhost shell]# strace -e network telnet 10.15.4.46 8080
Trying 10.15.4.46...
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_IP, IP_TOS, [16], 4) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("10.15.4.46")}, 16) = -1 ECONNREFUSED (Connection refused)
telnet: connect to address 10.15.4.46: Connection refused
+++ exited with 1 +++
查看文件描述符相关调用
-T:输出每个调用花费的时间
strace -p 10095 -q -f -s 10000 -e trace=desc -T

可以看到,是epoll这类文件描述符相关调用。
将结果写到文件
-o filename
Write the trace output to the file filename rather than to stderr. Use filename.pid if -ff is used. If the argument begins with '|' or with '!' then the rest of the argument is treated as a command and all output is piped to it. This is convenient for piping the debugging output to a program without affecting the redirections of executed programs.
strace -p 10095 -q -f -s 10000 -e trace=desc -v -o abc.txt
每个线程,生成一个文件
-ff
If the -o filename option is in effect, each processes trace is written to filename.pid where pid is the numeric process id of each process. This is incompatible with -c, since no per-process counts are kept.
strace -p 10095 -q -f -s 10000 -e trace=desc -ff -v -o abc.txt
效果如下:
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.23309
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.23379
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.23380
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.23381
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.23745
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.9479
-rw-r--r--. 1 root root 0 Jun 16 14:06 abc.txt.9480
统计一段时间内的系统调用
[root@localhost CAD_OneKeyDeploy]# strace -p 10095 -q -f -s 10000 -e trace=desc -c
^C% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.99 0.662317 22077 30 epoll_wait
0.01 0.000063 15 4 poll
0.00 0.000023 11 2 ioctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.662403 36 total
[root@localhost CAD_OneKeyDeploy]# strace -p 10095 -q -f -s 10000 -e trace=network -c
^C% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
73.33 0.000044 22 2 sendto
26.67 0.000016 8 2 recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00 0.000060 4 total
用strace启动命令
strace java -Dspring.profiles.active=peer1 -jar /home/ceiec/jars/xxx.jar
只打印我们关注的调用:open
strace -e trace=open java -Dspring.profiles.active=peer1 -jar /home/ceiec/jars/xxx.jar
参考
https://blog.51cto.com/liuleis/1784305
Linux下,如何监控某个进程到底向哪个地址发起了网络调用的更多相关文章
- Linux下查看某一进程所占用内存的方法
Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id 可以看到是2913,现在可以使用如下命令查 ...
- Linux下Tomcat端口、进程以及防火墙设置
Linux下Tomcat端口.进程以及防火墙设置 1,查看tomcat进程: #ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个 ...
- linux下脚本监控网络流量
linux下脚本监控网络流量 学习了:https://blog.csdn.net/chenghuikai/article/details/48437479 学习了:http://www.jb51.ne ...
- [转帖]Linux下inotify监控文件夹状态,发生变化后触发rsync同步
Linux下inotify监控文件夹状态,发生变化后触发rsync同步 https://www.cnblogs.com/fjping0606/p/6114123.html 1.安装工具--inotif ...
- Linux下查看端口占用进程号,程序名的方法
Linux下查看端口占用进程号,程序名的方法,方便我们查找什么进程导致系统变慢等需要.linux下查看端口占用情况: 1. 查看哪个进程占用了819端口: case9-sghfofo:/usr/loc ...
- linux下实现监控进程网络带宽
嗯,近期都在网易游戏实习,所以貌似有段时间没有上来写点东西了... 来网易游戏实习最基本的目的事实上就是想知道在游戏公司里面工作都是些什么内容,毕竟自己曾经也没有接触过游戏公司.. 还比較的好奇.. ...
- Linux下性能监控、守护进程与计划任务管理
目录 一:监视系统进程(ps .top) 二:查看网络连接信息 (netstat) 三:文件进程.端口关联(lsof) 四:计划任务管理(at .crontab) at crontab 一:监视系统进 ...
- Linux下如何查看哪个进程占用内存多?
1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者 ...
- Linux 下文件监控
本文转自http://www.jiangmiao.org/blog/2179.html 在日常应用中,常常会遇到以下场景,监控文件夹A,若文件夹中的B文件发生变化,则执行C命令.Linux下可以通过i ...
随机推荐
- Spring bean工厂配置头文件
命名 beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- MySQL的CHAR 和 VARCHAR的区别
CHAR 和 VARCHAR 类型,CHAR 列的长度固定, VARCHAR 列中的值为可变长字符串.在检索的时候,CHAR 列删除了尾部的空格,而 VARCHAR 则保留这些空格s
- ATX-UI自动化环境搭建
基础环境准备(以下都是在Mac机上搭建的) 1.android sdk安装&配置 很完美的一个资源下载网:tools.android-studio.org,下载所需的包(我下的zip包直接解压 ...
- html2canvas.js插件截图空白问题
发现使用 html2canvas.js插件截图保存在前端很方便.学习过程中预计问题. 截图出现空白和截图不全. 问题原因: html2canvas.js插件截图是基于body标签的,如果body存在滚 ...
- 08 . Python3高阶函数之迭代器、装饰器
Python3高阶函数之迭代器.装饰器 列表生成式 推导式就是构建比较有规律的列表,生成器. 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里 ...
- Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)
801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
- Java实现 LeetCode 912 排序数组(用数组去代替排序O(N))
912. 排序数组 给你一个整数数组 nums,将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5,1,1,2,0, ...
- Java实现蓝桥杯 算法提高 身份证号码升级
算法提高 身份证号码升级 时间限制:1.0s 内存限制:256.0MB 问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位 ...
- Java实现 蓝桥杯VIP 算法训练 斜率计算
输入两个点的坐标,即p1 = (x1, y1)和p2=(x2, y2),求过这两个点的直线的斜率.如果斜率为无穷大输出"INF". 样例输入 1 2 2 4 样例输出 2 样例输入 ...
- Java实现 LeetCode 5 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...