本机(linux)上某软件(rygel)打开后会提供http服务,然后可以通过http://10.4.47.249:56087/b815c168-1aa5-4da1-93a7-6a43494ac6dd.xml在浏览器中打开xml文件(10.4.47.249是本机的IP)
现在我想知道这个软件把哪个目录做成的http服务的目录(表达可能不太清楚,意思就是上面的xml文件在本机的哪个目录下),有没有什么工具/方法能够做到
PS:
我用find找这个xml文件了,没有找到而且不知道大概在哪个目录下所以是在/中find的,很费时间
问题的题目表述的也不太好,抱歉
以nginx为例说明一下:
第一步:根据端口号找到开启这个HTTP服务的PID
$ sudo netstat -lnp | grep ":80"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9623/nginx.conf
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 4229/python
可以看到pid=9623的进程在监听80端口。
第二步:根据PID找到可执行程序,及启动参数
在第一步中,看到了nginx.conf这个信息,但不能确定就是nginx,因为也有可能是淘宝的tengine。而且也不知道nginx的执行文件和配置文件位置。
$ ps 9623
PID TTY STAT TIME COMMAND
9623 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
第三步:去配置文件中找到HTTP服务的DocRoot
这一步就不多说了,打开/etc/nginx/nginx.conf文件看一下,就知道了。
由于在第二步,我们已经知道运行这个HTTP服务的具体命令了(就是/usr/sbin/nginx -c /etc/nginx/nginx.conf)。还有一个更直观的方法,可以监控你当前访问的XML文件在什么地方,那就是用strace,举个【栗子】:
郑重提醒,如果是数据库进程,或者是生产环境机器,千千万万不要这么干,正确的做法是询问部署这个HTTP服务的同事。
先kill掉这个进程:
sudo kill 9623
然后用strace启动nginx,同时监控它会打开哪些文件
sudo strace -f -e trace=open /usr/sbin/nginx -c /etc/nginx/nginx.conf
到浏览器端访问一下这个HTTP服务,strace就会打印出来nginx打开了哪些文件,输出类似这样:
[pid 4033] open("/var/cache/nginx/fastcgi_temp/1/00/0000000001", O_RDWR|O_CREAT|O_EXCL, 0600) = 19
[pid 4033] open("/var/www/html/tbw_tools/web_entrance/static/css/custom.css", O_RDONLY|O_NONBLOCK) = 16
[pid 4033] open("/var/www/html/tbw_tools/web_entrance/static/bootstrap/css/bootstrap.css", O_RDONLY|O_NONBLOCK) = 16
第一行是factcgi的目录(我是跑的nginx + php-fpm,所以会有这个),第二行开始,就能看到nginx的DocumentRoot啦。
用strace的好处:
1. 你可以不懂nginx的配置,比如你常用的是apache,临时碰到一个nginx要查
2. 比查nginx配置文件要快,即使你懂nginx,如果这个xml文件在某个virtualhost配置文件里面,virtualhost配置还用了正则表达式,那得费上几分钟才能读懂并查出来了
3. 如果你用的不是流行的web server,document root是写死在执行程序里的,配置文件里压根儿没有,那就没法通过配置文件来查了。这样的例子不是没有,早期的HiPhoP(Facebook的高性能PHP VM)直接把一个PHP项目打包成一个可执行文件,运行它即守护HTTP端口,PHP应用代码都编译成二进制代码放在可执行文件里了,根本不需要指定document root。
根据@henix 的提示,找到一种更简单的方法(测试通过):
1. netstat找出pid
2. strace -p $pid -e open
如果你确定这个文件不是动态生成的话可以用 lsof
lsof | grep b815c168-1aa5-4da1-93a7-6a43494ac6dd.xml
有评论说 web server 是打开后立刻关闭的,试了之后发现的确是这样。提供另一个思路:列出所有当前在 buffer cache 中的文件。
http://stackoverflow.com/questions/210809/how-can-you-tell-whether-a-file-is-being-cached-in-memory-in-linux 说到了 linux-ftools
还有 vmtouch 。但这些工具似乎都必须指定文件名,不能直接列出来。所以这个思路还差一点。。。