<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/</link>
<title><![CDATA[linux系统更新正在运行进程的可执行文件需要注意的/text file busy的原因及解决方案]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[linux操作系统]]></category>
<pubDate>Fri, 25 Oct 2013 03:24:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;最近发现很多同学不知道线上操作替换文件的要点。所以又整理了一下。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;线上替换一个正在运行进程的文件时（包括二进制、动态库、需要读取的资源文件等）。应避免使用cp/scp操作。而需要使用mv/rsync作为替代。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;原因：cp是将源文件截断然后写入新内容。也就是说正在打开这个文件的进程可以立刻感知到修改。修改文件内容很可能导致程序逻辑错误甚至崩溃。而mv则是标记”删除“老文件，然后放一个新的同名文件过去。也就是说老文件和新文件其实是两个不同文件（inode不同），只是名字一样而已。正在打开老文件的进程不会受到影响。如果进程使用了mmap打开某文件（比如载入so），如果目标文件被使用cp覆盖并且长度变小。那么读取差额部分的地址时（在新文件中其实已经不存在了），会导致SIGBUS信号。使进程崩溃。<br/><br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;至于可执行文件本身。倒是不怕cp导致崩溃。。因为cp时会报”text file busy"。压根cp不了。这时候也应该使用mv类操作。替换完成后重启进程。执行的就是新的可执行文件了。<br/><br/><br/><br/><br/><br/><br/>Tags - <a href="http://www.snooda.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/#blogcomment</link>
<title><![CDATA[[评论] linux系统更新正在运行进程的可执行文件需要注意的/text file busy的原因及解决方案]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>