<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]请问如何确认一个文件正在被哪个进程读写?]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 02 Sep 2014 14:08:21 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：有时一个文件，往往想知道是谁在写，是哪个进程，是哪个用户组的进程等，如：日志文件太大了，一直在写，但关了还有程序在写，能反查到是谁在写么？看起来简单，但是如果这个日志是多台机器都往里写：加载的NFS，Linux都挂载到日志上了。你怎么知道是哪台机器的进程在写能知道么？我没有NFS资源，但我想这都是一个问题：怎么我都关闭所有机器往该文件的写进程了，怎么用tail -f log文件，还有日志在写呢，这样的需求场景是有时会有的，于是有此博文出现。<br/><br/>一）在Linux下：<br/>请问如何确认一个文件正在被哪个进程读写?<br/>用lsof试一试<br/>lsof&#124;awk &#039;/&#92;&lt;filename&#92;&gt;;/&#123;print $2&#125;&#039;<br/>就简单的用:lsof 文件名<br/>实践如下，PHP-FPM进程日志文件作实验如下：<br/><textarea name="code" class="C" rows="15" cols="100">
[root@jackxiang php]# lsof php-fpm.log 
COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE DEVICE SIZE/OFF&nbsp;&nbsp;&nbsp;&nbsp;NODE NAME
php-fpm 32052 root&nbsp;&nbsp;&nbsp;&nbsp;2w&nbsp;&nbsp; REG&nbsp;&nbsp; 8,16&nbsp;&nbsp;&nbsp;&nbsp; 2384 5505027 php-fpm.log
php-fpm 32052 root&nbsp;&nbsp;&nbsp;&nbsp;4w&nbsp;&nbsp; REG&nbsp;&nbsp; 8,16&nbsp;&nbsp;&nbsp;&nbsp; 2384 5505027 php-fpm.log
</textarea><br/><textarea name="code" class="php" rows="15" cols="100">
[root@jackxiang php]# fuser -v php-fpm.log&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户&nbsp;&nbsp;&nbsp;&nbsp; 进程号 权限&nbsp;&nbsp; 命令
php-fpm.log:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32052 F.... php-fpm
</textarea><br/>根据进程号找到这个进程，Linux下如下命令即可找到：<br/><textarea name="code" class="php" rows="15" cols="100">
[root@jackxiang php]# ps aux&#124;grep 32052
root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 398&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0 103184&nbsp;&nbsp; 856 pts/4&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 22:11&nbsp;&nbsp; 0:00 grep 32052
root&nbsp;&nbsp;&nbsp;&nbsp; 32052&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0 341712&nbsp;&nbsp;5744 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ss&nbsp;&nbsp; 21:40&nbsp;&nbsp; 0:01 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) 
</textarea><br/>于是，原来是php-fpm的主进程在写这个文件，明白了。<br/>本站blog 之前问过同事的Url备查链接：https://jackxiang.com/post/6800/<br/><br/>二）在Windows上：<br/>filemon.exe 追踪特定程序运行的过程，包括读取的文件等等。你可以用这个试试<br/>Download:&nbsp;&nbsp; http://butian.org/soft/721.html<br/><br/>以下来自：<br/>http://bbs.chinaunix.net/thread-2225994-1-1.html<br/>http://zhidao.baidu.com/link?url=m6sJQBdrwYsCRoc9poMMldQSihlRxjq_oUOMwBJUE2F7gEny4qgkoRhGenYYA7xtyKXVtlB1AbDYNvmz-AsHMa<br/><br/>Linux下的用得比较多，摘自：http://blog.csdn.net/guang11cheng/article/details/16980667<br/>有许多情况下，我们需要查看一个进程当前打开了哪些文件，反过来我们也希望知道某一个文件正在被哪些进程所读写。在Linux下有许多有用的工具可以帮我们完成这两个工作，下面介绍这两个工具：lsof与fuser。<br/>&nbsp;&nbsp;&nbsp;&nbsp;fuser find files or sockets&#039; user <br/>&nbsp;&nbsp;&nbsp;&nbsp;格式：fuser [选项] fname <br/>&nbsp;&nbsp;&nbsp;&nbsp;-k 如果找到打开文件的进程，则发送SIGKILL杀死此进程，通过-i选项，可以为用户提供交互选择<br/>&nbsp;&nbsp;&nbsp;&nbsp;-signal 用户可以指定使用何种信号去kill进程，如果-k参数指定，则忽略此参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;-m 如果指定一个文件，则所有访问那个文件所在文件系统的进程都会被列出来<br/>&nbsp;&nbsp;&nbsp;&nbsp;-n&nbsp;&nbsp;type 指定不同的文件类型，默认类型为file，此外还支持tcp和udp类型，此时可以简写作port/tcp<br/>&nbsp;&nbsp;&nbsp;&nbsp;-u&nbsp;&nbsp;显示进程属主<br/>&nbsp;&nbsp;&nbsp;&nbsp;-v&nbsp;&nbsp;显示详细进程与打开文件信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;-4/-6 只搜索IPv4/IPv6套接字<br/>&nbsp;&nbsp;&nbsp;&nbsp;例如，我们想查看端口TCP端口9000由哪个进程打开 fuser -v -u 9000/tcp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看哪些进程在访问/home挂载分区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fuser -mv /home<br/>&nbsp;&nbsp;&nbsp;&nbsp;lsof list open file <br/>&nbsp;&nbsp;&nbsp;&nbsp;格式：lsof&nbsp;&nbsp;[选项] [names]<br/>&nbsp;&nbsp;&nbsp;&nbsp;单独执行lsof将输出系统中所有打开的文件，我们可以grep过滤出我们关心的内容，不过lsof提供了相应的参数帮助我们精确查找<br/>&nbsp;&nbsp;&nbsp;&nbsp;lsof name 将输出所有使用文件name的进程<br/>&nbsp;&nbsp;&nbsp;&nbsp;-p pid 列出进程pid所打开的所有文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;-d FD_pattern 列出所有已经打开的FD值为FD_pattern的文件FD的值有整数，TXT,MEM等等<br/>&nbsp;&nbsp;&nbsp;&nbsp;-a lsof后可以加多个匹配条件，默认为or连接，此参数将多个条件变成and关系<br/>&nbsp;&nbsp;&nbsp;&nbsp;-i [46] [proto] [@hostname&#124;ip][:service&#124;port] 用来选择占用某个端口的进程<br/>&nbsp;&nbsp;&nbsp;&nbsp;+d/+D dir 非递归或递归的显示打开dir下文件的进程<br/>&nbsp;&nbsp;&nbsp;&nbsp;-c string&nbsp;&nbsp; 显示进程的command中包含string的进程所打开的文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;-u username 显示属于user的进程所打开的文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;-g gid<br/>&nbsp;&nbsp;&nbsp;&nbsp; 以上这些参数已经足够用了，上面这两个工具都是读取/proc文件系统中的数据进行工作的。网上有提到借助于lsof的查找功能，可以对一个删除的文件进行恢复，前提是占用这个文件的进程当前还没有关闭。通过被删除的文件，找到对应的进程及在进程中的fd-num，然后通过cat /proc/process-num/fd/fd-num即可恢复被删除的文件。 
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]请问如何确认一个文件正在被哪个进程读写?]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>