首页 > 查找本机的http服务对应的本机目录

查找本机的http服务对应的本机目录

本机(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 。但这些工具似乎都必须指定文件名,不能直接列出来。所以这个思路还差一点。。。

【热门文章】
【热门文章】