﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客网-我的ITblog我作主　　关注→　『伊波拉』→　测试　SzDlinXie- ITblog　　  　　   -随笔分类-Linux基础杂志</title><link>http://www.cnitblog.com/szdlinxie/category/4487.html</link><description>·√·  本ITblog站点记录相关的软件技术文档、网络技术杂志、测试技术杂谈等技术文档的管理站点.联系方式：MSN：dowling@sunlike.cn   QQ:94595885</description><language>zh-cn</language><lastBuildDate>Tue, 06 May 2008 20:34:55 GMT</lastBuildDate><pubDate>Tue, 06 May 2008 20:34:55 GMT</pubDate><ttl>60</ttl><item><title>Linux服务器性能数据收集-Sysstat介绍</title><link>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 06 May 2008 03:12:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/43396.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/43396.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/43396.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><strong><span>Linux</span></strong><strong><span>服务器性能数据收集</span></strong></p>
<p align=center><strong><span>Sysstat</span></strong><strong><span>介绍</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp; <strong><u><span>Linux</span></u></strong></span><span>中的<span>top,free</span>等命令不能完全满足我们性能数据收集的要求，我们需要一个更加强大的工具来收集性能数据。经过考察和对比，发现<span>Sysstat</span>是一个非常强大的工具，因此下载了试了下，效果不错。<span>Sysstat</span>是一个工具集，包括<span>sar</span>、<span>pidstat</span>、<span>iostat</span>、<span>mpstat</span>、<span>sadf</span>、<span>sadc</span>。其中<span>sar</span>是其中最强大，也是最能符合我们<strong><u><span>测试</span></u></strong>要求的工具，同时<span>pidstat</span>也是非常有用的东东，因此本文结合<strong><u><span>性能测试</span></u></strong>重点介绍这两个工具。<span> </span></span></p>
<p align=left><strong><span>Sysstat</span></strong><strong><span>的安装</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>从<span>http://pagesperso-orange.fr/sebastien.godard/download.html</span>下载最新版本，解压，安装<span> </span></span></p>
<ul type=disc>
    <li><span>&nbsp;wget&nbsp;http://pagesperso-orange.fr/sebastien.godard/sysstat-<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">8.1.2</st1:chsdate>.tar.gz<br>&nbsp;tar&nbsp;zxvf&nbsp;sysstat-8.1.2.tar.gz<br>&nbsp;cd&nbsp;sysstat-8.1.2<br>&nbsp;./configure<br>&nbsp;make<br>&nbsp;su<br>&nbsp;&lt;enter&nbsp;root&nbsp;password&gt;<br>&nbsp;make&nbsp;install</span></li>
</ul>
<p align=left><strong><span>监视某个进程</span></strong></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>通过<span>ps</span>命令找到相应进程的<span>PID</span>：<span> </span></span></p>
<p align=left><span><img src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1040"><span>ps&nbsp;-e</span></span></p>
<p align=left><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用<span>pidstat</span>命令监视进程，详细用法见：<u><span>http://pagesperso-orange.fr/sebastien.godard/man_pidstat.html</span></u><span> </span></span></p>
<p align=left><span>pidstat&nbsp;</span><span>2</span>&nbsp;<span>5</span><span>&nbsp;<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，所有活动进程的<span>CPU</span>使用情况<span><br></span></span><span>pidstat&nbsp;-p&nbsp;</span><span>3132</span>&nbsp;<span>2</span>&nbsp;<span>5</span><span>&nbsp;<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>PID</span>为<span>1643</span>的进程的<span>CPU</span>使用情况显示<span><br></span></span><span>pidstat&nbsp;-p&nbsp;</span><span>3132</span>&nbsp;<span>2</span>&nbsp;<span>5</span><span>&nbsp;-r<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>PID</span>为<span>1643</span>的进程的内存使用情况显示</span></p>
<p align=left><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>很可惜的是，<span>pidstat</span>命令没有保存性能数据的功能。<span> </span></span></p>
<p align=left><strong><span>查看性能数据</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>在<span>sysstat</span>工具包中，<span>sar</span>是最强大的了，通过<span>sar</span>几乎可以监视所有的性能数据，同时，<span>sar</span>还支持将性能数据保存起来。<span><br>sar</span>详细用法请见：<span><a href="http://pagesperso-orange.fr/sebastien.godard/man_sar.html">http://pagesperso-orange.fr/sebastien.godard/man_sar.html</a> </span></span></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看<span>CPU</span>使用情况<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1041"><span>sar&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1042"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>CPU</span>使用的情况</span></p>
<p align=left><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看内存使用情况<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1043"><span>sar&nbsp;-r&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1044"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，内存使用的情况</span></p>
<p align=left><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看网络吞吐量<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1045"><span>sar&nbsp;-n&nbsp;DEV&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1046"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，网络吞吐量情况</span></p>
<p align=left><strong><span>保存性能数据</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sar</span><span>支持保存成两种格式的文件，一种是文本文件，一种是二进制文件（只有通过<span>sar</span>自己的命令才能查看）。<span> </span></span></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>保存为文本文件</span></strong><span><br><br></span><span>结合上面的查看命令，加入<span> &gt; filename </span>参数即可保存文本文件，下面列出几个有用的命令：<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1047"><span>sar&nbsp;</span><span>1</span>&nbsp;<span>10</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1048"></span><span>//</span></span><span>每隔<span>1</span>秒，写入<span>10</span>次，把<span>CPU</span>使用数据保存到<span>data.txt</span>文件中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1049"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1050"></span><span>//</span><span>每隔<span>1</span>秒记录<span>CPU</span>的使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。<span>(-e&nbsp;</span>参数表示结束时间，注意时间格式：必须为<span>hh:mm:ss</span>格式<span>)<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1051"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-r&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1052"></span><span>//</span><span>每隔<span>1</span>秒记录内存使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1053"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-n&nbsp;DEV&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1054"></span><span>//</span><span>每隔<span>1</span>秒记录网络使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。</span></p>
<p align=left><span>用<span>WinSCP</span>工具从<span>Linux</span>服务器上取下<span>data.txt</span>文件，内容如下：</span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1055"><span>Linux&nbsp;</span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899"><span>2.6</span><span>.</span><span>18</span></st1:chsdate><span>-</span><span>53</span><span>.el5&nbsp;(Performancesvr5)&nbsp;&nbsp;<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="05" Month="05" Year="2008">2008<span><span>年05</span></span><span><span>月05</span></span><span><span>日</span></span></st1:chsdate>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x86_64_<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1056"><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1057">&nbsp;11</span></span><span>时<span>04</span>分<span>05</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%nice&nbsp;&nbsp;&nbsp;%system&nbsp;&nbsp;&nbsp;%iowait&nbsp;&nbsp;&nbsp;&nbsp;%steal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%idle<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1058">&nbsp;11</span>时<span>04</span>分<span>06</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1030">&nbsp;11</span><span>时<span>04</span>分<span>07</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1031">&nbsp;11</span><span>时<span>04</span>分<span>08</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>1.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.00</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1032">&nbsp;11</span><span>时<span>04</span>分<span>09</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.25</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1033">&nbsp;11</span><span>时<span>04</span>分<span>10</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>100.00</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1034">&nbsp;11</span><span>时<span>04</span>分<span>11</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.50</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1035">&nbsp;11</span><span>时<span>04</span>分<span>12</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1036">&nbsp;11</span><span>时<span>04</span>分<span>13</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.99</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.01</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1037">&nbsp;11</span><span>时<span>04</span>分<span>14</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>1.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1038">&nbsp;11</span><span>时<span>04</span>分<span>15</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.50</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1039">&nbsp;</span><span>平均时间<span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.20</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.15</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.42</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.23</span></p>
<p align=left><span>有了这份数据，就可以轻松的使用<span>WPS</span>表格来统计<span>CPU</span>的使用情况了。<span> </span></span></p>
<p align=center><span><img border=0 alt=111 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image002.jpg" width=529 height=278 v:shapes="_x0000_i1025"></span></p>
<p align=left><strong><span>保存为二进制文件</span></strong><span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>由于保存的二进制文件只有<span>sar</span>通过<span>-f</span>参数才能打开，不利于我们分析和统计数据，因此不推荐使用这个方法。保存二进制文件的参数是<span>-o</span>，如：<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1026"><span>sar&nbsp;</span><span>1</span>&nbsp;<span>5</span><span>&nbsp;-r&nbsp;-o&nbsp;data<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1027"></span><span>//</span></span><span>每隔<span>1</span>秒，写入<span>5</span>次，将内存使用的数据写入二进制文件<span>data</span>中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1028"></span></span><span>sar&nbsp;-f&nbsp;data<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1029"></span><span>//</span><span>查看<span>data</span>文件</span></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/43396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2008-05-06 11:12 <a href="http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件开发项目过程中的风险管理研究</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32146.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 21 Aug 2007 07:20:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32146.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32146.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32146.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32146.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32146.html</trackback:ping><description><![CDATA[&nbsp;
<table cellSpacing=0 cellPadding=0 width=535 border=0>
    <tbody>
        <tr>
            <td>
            <p align=center><strong><span>软件开发项目过程中的风险管理研究<span>[1]</span></span></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center>&nbsp;</p>
            <p align=left><span>软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响。软件项目风险会影响项目计划的实现，如果项目风险变成现实，就有可能影响项目的进度，增加项目的成本，甚至使软件项目不能实现。如果对项目进行风险管理，就可以最大限度的减少风险的发生。但是，目前国内的软件企业不太关心软件项目的风险管理，结果造成软件项目经常性的延期、超过预算，甚至失败。成功的项目管理一般都对项目风险进行了良好的管理。因此任何一个系统开发项目都应将风险管理作为软件项目管理的重要内容。<span> </span></span></p>
            <p align=left><span>　　在项目风险管理中，存在多种风险管理方法与工具，软件项目管理只有找出最适合自己的方法与工具并应用到风险管理中，才能尽量减少软件项目风险，促进项目的成功。</span></p>
            <p align=left><span>　　项目风险管理</span></p>
            <p align=left><span>　　项目风险管理是指为了最好的达到项目的目标，识别、分配、应对项目生命周期内风险的科学与艺术。项目风险管理的目标是使潜在机会或回报最大化，使潜在风险最小化。风险管理涉及的主要过程包括：风险识别，风险量化，风险应对计划制定和风险监控，如图<span>1</span>所示。风险识别在项目的开始时就要进行，并在项目执行中不断进行。就是说，在项目的整个生<span>?</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p><span>（<span>1</span>）需求风险<span> </span></span></p>
<p><span>　　<span>①</span>需求已经成为项目基准，但需求还在继续变化；</span></p>
<p><span>　　<span>②</span>需求定义欠佳，而进一步的定义会扩展项目范畴；</span></p>
<p><span>　　<span>③</span>添加额外的需求；</span></p>
<p><span>　　<span>④</span>产品定义含混的部分比预期需要更多的时间；</span></p>
<p><span>　　<span>⑤</span>在做需求中客户参与不够；</span></p>
<p><span>　　<span>⑥</span>缺少有效的需求变化管理过程。</span></p>
<p><span>　　（<span>2</span>）计划编制风险</span></p>
<p><span>　　<span>①</span>计划、资源和产品定义全凭客户或上层领导口头指令，并且不完全一致；</span></p>
<p><span>　　<span>②</span>计划是优化的，是<span>"</span>最佳状态<span>"</span>，但计划不现实，只能算是<span>"</span>期望状态<span>"</span>；</span></p>
<p><span>　　<span>③</span>计划基于使用特定的小组成员，而那个特定的小组成员其实指望不上；</span></p>
<p><span>　　<span>④</span>产品规模<span>(</span>代码行数、功能点、与前一产品规模的百分比<span>)</span>比估计的要大；</span></p>
<p><span>　　<span>⑤</span>完成目标日期提前，但没有相应地调整产品范围或可用资源；</span></p>
<p><span>　　<span>⑥</span>涉足不熟悉的产品领域，花费在设计和实现上的时间比预期的要多。</span></p>
<p><span>　　（<span>3</span>）组织和管理风险</span></p>
<p><span>　　<span>①</span>仅由管理层或市场人员进行技术决策，导致计划进度缓慢，计划时间延长；</span></p>
<p><span>　　<span>②</span>低效的项目组结构降低生产率；</span></p>
<p><span>　　<span>③</span>管理层审查决策的周期比预期的时间长；</span></p>
<p><span>　　<span>④</span>预算削减，打乱项目计划；</span></p>
<p><span>　　<span>⑤</span>管理层作出了打击项目组织积极性的决定；</span></p>
<p><span>　　<span>⑥</span>缺乏必要的规范，导致工作失误与重复工作；</span></p>
<p><span>　　<span>⑦</span>非技术的第三方的工作<span>(</span>预算批准、设备采购批准、法律方面的审查、安全保证等<span>)</span>时间比预期的延长。</span></p>
<p><span>　　（<span>4</span>）人员风险</span></p>
<p><span>　　<span>①</span>作为先决条件的任务<span>(</span>如培训及其他项目<span>)</span>不能按时完成；</span></p>
<p><span>　　<span>②</span>开发人员和管理层之间关系不佳，导致决策缓慢，影响全局；</span></p>
<p><span>　　<span>③</span>缺乏激励措施，士气低下，降低了生产能力；</span></p>
<p><span>　　<span>④</span>某些人员需要更多的时间适应还不熟悉的软件工具和环境；</span></p>
<p><span>　　<span>⑤</span>项目后期加入新的开发人员，需进行培训并逐渐与现有成员沟通，从而使现有成员的工作效率降低；</span></p>
<p><span>　　<span>⑥</span>由于项目组成员之间发生冲突，导致沟通不畅、设计欠佳、接口出现错误和额外的重复工作；</span></p>
<p><span>　　<span>⑦</span>不适应工作的成员没有调离项目组，影响了项目组其他成员的积极性；</span></p>
<p><span>　　<span>⑧</span>没有找到项目急需的具有特定技能的人。</span></p>
<p>&nbsp;</p>
<p><span>（<span>5</span>）开发环境风险<span> </span></span></p>
<p><span>　　<span>①</span>设施未及时到位；</span></p>
<p><span>　　<span>②</span>设施虽到位，但不配套，如没有电话、网线、办公用品等；</span></p>
<p><span>　　<span>③</span>设施拥挤、杂乱或者破损；</span></p>
<p><span>　　<span>④</span>开发工具未及时到位；</span></p>
<p><span>　　<span>⑤</span>开发工具不如期望的那样有效，开发人员需要时间创建工作环境或者切换新的工具；</span></p>
<p><span>　　<span>⑥</span>新的开发工具的学习期比预期的长，内容繁多。</span></p>
<p><span>　　（<span>6</span>）客户风险</span></p>
<p><span>　　<span>①</span>客户对于最后交付的产品不满意，要求重新设计和重做；</span></p>
<p><span>　　<span>②</span>客户的意见未被采纳，造成产品最终无法满足用户要求，因而必须重做；</span></p>
<p><span>　　<span>③</span>客户对规划、原型和规格的审核决策周期比预期的要长；</span></p>
<p><span>　　<span>④</span>客户没有或不能参与规划、原型和规格阶段的审核，导致需求不稳定和产品生产周期的变更；</span></p>
<p><span>　　<span>⑤</span>客户答复的时间<span>(</span>如回答或澄清与需求相关问题的时间<span>)</span>比预期长；</span></p>
<p><span>　　<span>⑥</span>客户提供的组件质量欠佳，导致额外的测试、设计和集成工作，以及额外的客户关系管理工作。</span></p>
<p><span>　　（<span>7</span>）产品风险</span></p>
<p><span>　　<span>①</span>矫正质量低下的不可接受的产品，需要比预期更多的测试、设计和实现工作；</span></p>
<p><span>　　<span>②</span>开发额外的不需要的功能<span>(</span>镀金<span>)</span>，延长了计划进度；</span></p>
<p><span>　　<span>③</span>严格要求与现有系统兼容，需要进行比预期更多的测试、设计和实现工作；</span></p>
<p><span>　　<span>④</span>要求与其他系统或不受本项目组控制的系统相连，导致无法预料的设计、实现和测试工作；</span></p>
<p><span>　　<span>⑤</span>在不熟悉或未经检验的软件和硬件环境中运行所产生的未预料到的问题；</span></p>
<p><span>　　<span>⑥</span>开发一种全新的模块将比预期花费更长的时间；</span></p>
<p><span>　　<span>⑦</span>依赖正在开发中的技术将延长计划进度。<span> </span></span></p>
<p><span>　　（<span>8</span>）设计和实现风险</span></p>
<p><span>　　<span>①</span>设计质量低下，导致重复设计；</span></p>
<span>　　</span><span>②</span><span>一些必要的功能无法使用现有的代码和库实现，开发人员必须使用新的库或者自行开发新的功能</span>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 15:20 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux与Windows CVS服务器配置与使用</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27371.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 21 May 2007 06:12:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27371.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/27371.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/27371.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/27371.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><strong><span>Linux</span></strong><strong><span>与<span>Windows CVS</span>服务器配置与使用<span>1</span></span></strong></p>
<p align=left><strong><span>第一部分<span> CVS</span>服务器的配置<span>(</span>以<span>1.10</span>版<span>)</span></span></strong><span> </span></p>
<p align=left><strong><span>1</span></strong><strong><span>、<span> CVS</span>简述与<span>CVS</span>服务器的安装：</span></strong><span> </span></p>
<p align=left><span>CVS</span><span>是目前比较流行与优秀的版本管理与控制工具，它深受大多数开发人员与系统管理的喜爱，同时也是用来管理其它日常文档（如<span>word</span>工作文档之类）的一个强有力的工具。这一部分将对<span>CVS</span>服务器的安装、配置与使用方法进行简单、扼要的介绍，以帮助大家尽快的使用<span>CVS</span>来进行一些版本的管理与控制<span><a href="javascript:;" target=_self><strong><span><span>工作</span></span></strong></a></span>。 </span></p>
<p align=left><strong><span>2</span></strong><strong><span>、<span> CVS</span>服务器的安装</span></strong><span> </span></p>
<p align=left><span>CVS</span><span>服务器版可以从网上的很多地方下载到，也可以到<span>CVS</span>的官方网站进行下载。根据你所使用的系统，下载相应的版本，然后进行安装。因为当前大部分人是在<span><a href="javascript:;" target=_self><strong><span>Linux</span></strong></a></span>下使用<span>CVS</span>服务器进行版本管理，并且<span>Redhat Linux</span>是目前最流行的一个<span>Linux</span>发行版之一，所以本文将主要基于<span>Redhat Linux</span>进行介绍。首先下载<span>CVS</span>服务器的<span>rpm</span>包，当然也可以下载其它方式的包如源程序包，这也就是<span>Linux</span>的一个优点之一。然后采用以下命令进行安装： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　<span>rpm -ivh cvs-<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">1.10.8</st1:chsdate>-3.i386.rpm</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><strong><span>3</span></strong><strong><span>、配置<span>/etc/services</span>文件：</span></strong><span> </span></p>
<p align=left><span>安装完之后的第一件事就是要配置<span>CVS</span>服务器的配置文件，使其能正常的工作。首先在<span>services</span>文件中添加<span>cvspserver</span>，使其成为<span>Linux</span>的一种服务也就是<span>cvs</span>服务器例程的入口，配置如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>cvspserver 2401/tcp # cvs client/server operations </span></p>
            <p align=left><span>　　<span>cvspserver 2401/udp # cvs client/server operations</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><strong><span>4</span></strong><strong><span>、配置<span>xinetd</span>，用<span>xinetd</span>来启动<span>CVS</span>服务器：</span></strong><span> </span></p>
<p align=left><span>进入到<span>/etc/xinetd.d/</span>目录，然后编辑一个文本文件，名字一定要与<span>/etc/services</span>中的入口名字<span>cvspserver</span>一致，所以这里用<span>cvspserver</span>作为文件名，文件的内容如下所示： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>service cvspserver</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>disable = no</span></span></p>
            <p align=left><span>　　<span>socket_type = stream</span></span></p>
            <p align=left><span>　　<span>wait = no</span></span></p>
            <p align=left><span>　　<span>user = root</span></span></p>
            <p align=left><span>　　<span>env = HOME=</span></span></p>
            <p align=left><span>　　<span>server = /usr/bin/cvs</span></span></p>
            <p align=left><span>　　<span>server_args = -f --allow -root=/home/cvsroot pserver</span></span></p>
            <p align=left><span>&nbsp;//</span><span>指定认证方式为<span>pserver</span>，注意：<span>-f</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>注意：<span>a</span>、<span>service</span>后面的名称一定要和你在<span>/etc/service</span>文件中的<span>cvs</span>服务名称一样。 </span></p>
<p align=left><span>b</span><span>、<span>env = HOME=</span>这一行的目的就是为了解决在执行一些<span>cvs</span>操作时产生的读取<span>/root/.cvsignore</span>文件的错误，上面<span>env</span>那行的意思就是在运行<span>cvs</span>服务的时候将环境变量<span>HOME</span>置空，这样虽然执行<span>cvs</span>的用户是<span>root</span>，但是由于没有了<span>HOME</span>这个环境变量，所以<span>cvs</span>就不会在去读取<span>/root/.cvsignore</span>文件了。 </span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>Linux</span></strong><strong><span>与<span>Windows CVS</span>服务器配置与使用<span>2</span></span></strong></p>
<p align=left><strong><span>5</span></strong><strong><span>、配置<span>CVS</span>用户与<span>cvsroot</span>的属主与属组：</span></strong><span> </span></p>
<p align=left><span>首先建立一个用户组<span>cvs</span>，可以使用<span>groupadd</span>或者<span>addgroup</span>命名，也可以直接编辑<span>/etc/group</span>文件添加这个组，然后添加一个用户<span>cvsroot</span>， 然后修改<span>/etc/passwd</span>文件使<span>cvsroot</span>用户的缺省组是<span>cvs</span>组，而不是<span>cvsroot</span>组（也就是修改）。在<span>/home</span>目录下建立<span>cvsroot</span>目录（也可以在其它你喜欢的目录下建），然后修改<span>/home/cvsroot</span>的属主及属性： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>#chown cvsroot.cvs /home/cvsroot </span></p>
            <p align=left><span>　　<span>#chmod 771 /home/cvsroot</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><strong><span>6</span></strong><strong><span>、<span> vs</span>进行初始化：</span></strong><span> </span></p>
<p align=left><span>安装完<span>CVS</span>服务器之后的另一件重要的事情就是要初始化<span>CVS</span>服务器的根目录，以后创建的<span>CVS</span>项目都将建立在这个目录下，采用的命令如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　＃<span>cvs -d /home/cvsroot init</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>这样目录<span>/home/cvsroot</span>就成为<span>CVS</span>服务器的根目录，以后创建的目录都将默认的存放在这个目录下。 </span></p>
<p align=left><strong><span>7</span></strong><strong><span>、登录<span>cvs</span>服务器（在<span>Linux</span>或其它<span>Unix</span>系统下进行登录的情况）：</span></strong><span> </span></p>
<p align=left><span>a</span><span>、如果是远程登录，采用以下语法： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　<span>#cvs -d :pserver:cvsroot@host:/home/cvsroot login </span></span></p>
            <p align=left><span>CVS password</span><span>：<span>//</span>输入用户<span>cvsroot</span>的口令；</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>如果没有出现其它的任何提示就表示登录成功了，否则要根据提示进行相应的修改。 下面对登录命令的语法进行说明： </span></p>
<p align=left><span>其中，<span>:pserver</span>表示采用<span>pserver</span>方式进行用户登录认证，一般的<span>CVS</span>服务器都采用这种方式，当然也可以采用其它方式，具体参考相应的资料；<span>:cvsroot</span>表示要登录的用户名，只要是<span>cvs</span>组的成员都可以，如：<span>cather</span>；<span>@host</span>表示要登录的服务器，可以是<span>DNS</span>名，也可以是<span>IP</span>地址，如：<span>10.104.1.204</span>；<span>:/home/cvsroot</span>表示<span>CVS</span>在服务器上的目录，也可以是其它目录（由第<span>6</span>中你所指定的用来做<span>init</span>初始化的目录决定）；提示：也可以把<span>export CVSROOT=:pserver:jchuang@192.168.0.8:/home/cvsroot</span>这一句直接写在用户的初始化文件中（如：<span>.bash_profile</span>），这样用户每次登录时，只需输入： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　＃<span>cvs login</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>然后输入相应的口令就可以登录到<span>cvs</span>服务器上。 </span></p>
<p align=left><span>b</span><span>、如果是本地登录，可以直接把<span>export CVSROOT=/home/cvsroot</span>这一句写在用户的初始化文件如：<span>.bash_profile</span>中；然后直接 </span></p>
<p align=left><strong><span>8</span></strong><strong><span>、向<span>CVS</span>添加新的项目模块</span></strong><span> </span></p>
<p align=left><span>一般我们都已经有一个或多个项目了，这样我们可以用下面步骤生成一个新的<span>CVS</span>项目。将一个工程文件置于<span>CVs</span>中进行版本控制，在<span>CVS </span>术语中称作导入<span>(import)</span>。从名字上就可以看出，在导入前需要为此作些准备工作。 </span></p>
<p align=left><span>输入操作的基本要求是有个<span>"</span>干净<span>"</span>的目录结构。<span>"</span>干净<span>"</span>的意思是不需要版本控制的文件都被移走了（如编译生成的文件，备份文件等等）。如果工程已经开始一段时间了，这就显得很重要。在目录中也许有些是不打算将其置于版本控制下的文件，但是又想将他们放在这里，这种情况下，你要在输入之前将它们移走，然后再移回来。 </span></p>
<p align=left><span>注意的是<span>CVS </span>认为空目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录，需要在其下创建一个哑文件。建议你创建一个名为<span> README.txt </span>的文件，其内容为对目录的简要说明。 </span></p>
<p align=left><span>进入到已有项目的目录，比如叫<span> cvstest</span>： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　　　<span>$cd cvstest</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>运行命令将项目文件导入到<span>cvs</span>仓库中： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　　　<span>$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>说明：<span>import </span>是<span>cvs</span>的命令之一，表示向<span>cvs</span>仓库输入项目文件。 </span></p>
<p align=left><span>-m</span><span>参数后面的字串是描述文本，对项目进行描述，如果不加<span> -m </span>参数，那么<span>cvs</span>会自动运行一个编辑器（一般是<span>vi</span>，但是可以通过修改环境变量<span>EDITOR</span>来改成你喜欢用的编辑器）让你输入信息，<span>cvstest </span>是项目名称（实际上是仓库名，在<span>CVS</span>服务器上会存储在以这个名字命名的仓库里）<span> v_0_0_1</span>是这个分支的总标记．没啥用（或曰不常用）。<span>start </span>是每次<span> import </span>标识文件的输入层次的标记，没啥用。这样我们就在用户指定进行初始化的目录<span>/home/cvsroot</span>下建立了一个名字叫<span>cvstest</span>的<span>CVS</span>模块了，然后，我们可以把这个测试项目的文件删除，试验如何从仓库获取文件这会在后面的客户端文章进行说明。<span>(</span>注：本小节主要引用自<span>http://linuxaid.com.cn</span>何伟平的<span>&#8220;CVS</span>服务器快速指南<span>&#8221;) </span></span></p>
<p align=left><strong><span>9</span></strong><strong><span>、从<span>cvs</span>本地服务器上<span>checkout</span>相应的模块：</span></strong><span> </span></p>
<p align=left><span>a</span><span>、如果是在<span>CVS</span>服务器所在计算机上，可以直接采用如下命令： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　　<span>#cvs checkout stw</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>这样将把<span>stw</span>项目模块<span>checkout</span>到当前目录下。 </span></p>
<p align=left><span>b</span><span>、如果是在远程运行<span>Linux</span>或其它<span>Unix</span>系统上，在第<span>7</span>中登录之后也可以用上边的命令把相应的项目模块<span>checkout</span>到当前目录下。另外，如果是在<span>windows</span>端进行<span>checkout</span>，可以采用<span>WinCVS</span>，那么还要对<span>WinCVS</span>进行其它的一些配置，下一部分将具体介绍它的配置方法。 </span></p>
<p align=left><strong><span>Linux</span></strong><strong><span>与<span>Windows CVS</span>服务器配置与使用<span>3</span></span></strong></p>
<p align=left><strong><span>第二部分<span> WinCVS</span>的配置与使用方法</span></strong><span> </span></p>
<p align=left><strong><span>1</span></strong><strong><span>、<span> WinCVS</span>简介：</span></strong><span> </span></p>
<p align=left><span>WinCVS</span><span>是<span>CVS</span>的一个客户端软件，它运行在<span>Windows</span>上，用来在<span>Windows</span>上登录<span>CVS</span>服务器，然后进行一些<span>CVS</span>相关的操作与管理。由于当前很多的企业内部都采用<span>Linux/Unix</span>做服务器，而用<span>Windows</span>做客户端，所以，<span>WinCVS</span>与<span>CVS</span>服务器配合使用将组成最强有力的版本控制与管理的系统之一。 </span></p>
<p align=left><strong><span>2</span></strong><strong><span>、<span> WinCVS</span>的下载与安装；</span></strong><span> </span></p>
<p align=left><span>最新的<span>WinCVS</span>可以从<span>http://sourceforge.net/project/showfiles.php?group_id=10072</span>地址下载到，也可以在<span>http://sourceforge.net/project </span>上下载到最新的或其它版本的<span>WinCVS</span>。 </span></p>
<p align=left><span>下载到相应的版本后根据向导进行安装，已经要使用<span>CVS</span>的用户，安装这个<span>WinCVS</span>应该没什么问题吧！ </span></p>
<p align=left><strong><span>3</span></strong><strong><span>、 配置<span>WinCVS</span>：</span></strong><span> </span></p>
<p align=left><span>第一、<span> Authentication</span>：用来配置<span>cvs</span>服务器的认证方式，可以从下拉框中选择其它的认证方式，不过一般只要选择默认的<span>pserver</span>方式就可以，要注意的是必须与<span>cvs</span>服务器配置时所指定的认证方式一致。 </span></p>
<p align=left><span>第二、<span> Path</span>：用来配置<span>cvs</span>在服务器上的主目录路径，也就是服务器上用进行<span>cvs</span>初始化的目录，如：<span>/home/cvsroot</span>。 </span></p>
<p align=left><span>第三、<span> Host Address</span>：用来配置<span>cvs</span>服务器所在服务器的地址，可以是<span>IP</span>地址，也可以是<span>DNS</span>名，如：<span>10.104.1.204</span>。 </span></p>
<p align=left><span>第四、<span> User name</span>：用来配置要使用些<span>WinCVS</span>来登录<span>CVS</span>服务器的用户名，如：<span>cvsyxwu</span>，用户的登录必须由管理员把其添加<span>cvs</span>用户组中； </span></p>
<p align=left><span>第五、<span> CVSROOT</span>：此项一般都不需要用户进行修改，用户在输入上边的几个选项时，系统将自动根据用户的输入生成此项的相应内容。 </span></p>
<p align=left><span>b</span><span>、 全局选项的设置，在上一个界面上选择<span>&#8220;Globals&#8221;</span>此项的配置主要是要注意这几选项： </span></p>
<p align=left><span>第一，<span>Checkout read-only</span>不要选上，否则，<span>checkout</span>出来的源代码将不允许用户进行修改，并且此选项默认是选中的。 </span></p>
<p align=left><span>第二，<span>Prune (remove) empty directories</span>也不要选上，否则，会自动删除空目录。 </span></p>
<p align=left><span>第三，对一般配置没有特殊要求的，把<span>Dirty files support</span>、<span>Supply control when adding</span>与<span>TCP/IP compression</span>选项选中。 </span></p>
<p align=left><strong><span>4</span></strong><strong><span>、 登录服务器：</span></strong><span> </span></p>
<p align=left><span>选择<span>Admin-&gt;login</span>，将出现如下对话框要求用户输入登录口令<span>,</span>输入口令后，选择<span>&#8220;OK&#8221;</span>按钮，如果<span>CVS</span>服务器与<span>WinCVS</span>的配置都没出错的话，将在<span>CVS</span>的状态栏中提示： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　<span>cvs -z9 -d :pserver:cvsyxwu@10.104.1.204:/home/cvsroot login </span></span></p>
            <p align=left><span>　　<span>Logging in to :pserver:cvsyxwu@10.104.1.204:2401/home/cvsroot</span></span></p>
            <p align=left><span>　　<span>***** CVS exited normally with code 0 *****</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>code 0</span><span>表示正确的登录；而如果出错的话，将是<span>code 1</span>，那么要根据错误的提示进行相应的修改。 </span></p>
<p align=left><strong><span>5</span></strong><strong><span>、 从<span>CVS</span>服务器上<span>check out</span>相应的模块：</span></strong><span> </span></p>
<p align=left><span>第一， 在<span>workspace</span>中的<span>Modules</span>选中要存放<span>checkout</span>模块的目录。 </span></p>
<p align=left><span>第二， 选择<span>Create-&gt;Checkout Modeles</span>，将出现如下对话框。 </span></p>
<p align=left><span>其中，<span>Module name and path on the server</span>就是要存放<span>checkout </span>内容的目录，由用户输入；而<span>Local folder to checkout to</span>就是第一中用户所选择的目录。 </span></p>
<p align=left><strong><span>Linux</span></strong><strong><span>与<span>Windows CVS</span>服务器配置与使用<span>4</span></span></strong></p>
<p align=left><strong><span>6</span></strong><strong><span>、 修改之后把文件提交到<span>CVS</span>服务器</span></strong><span> </span></p>
<p align=left><span>a)</span><span>、只有一个用户对文件进行修改的情况 </span></p>
<p align=left><span>用自己喜欢的编辑器对<span>checkout</span>出来的文件进行修改，修改之后的文件在没有提交之前会是红色的，如下图<span>example.h</span>文件<span>. </span></span></p>
<p align=left><span>选中红色的文件<span>example.h</span>后右击选择<span>&#8220;Commit Selection&#8221;</span>选项，如果没有其它用户也对其进行修改并已经提交到<span>CVS</span>服务器上，一切正常的话将把<span>example.h</span>文件提交到<span>CVS</span>服务器并把图标恢复成原来的颜色。 </span></p>
<p align=left><span>b)</span><span>、两个或两个以上的用户对同一文件的不同部分进行修改的情况 </span></p>
<p align=left><span>这种情况就是如用户<span>A</span>与用户<span>B</span>都<span>checkout</span>了文件<span>example.h</span>，内容如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>int callby (int count)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("ExcelStor!\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>void main(int argv,char *argc)</span></span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>//added by my cvs</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>int mainexample()</span></span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("OK\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>然后用户<span>A</span>修改成如下，并提交到<span>CVS</span>服务器（一般将正常提交）： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>int callby (int count)</span></p>
            <p align=left><span>　　<span>{//add</span></span></p>
            <p align=left><span>　　<span>printf("ExcelStor!\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>void main(int argv,char *argc)</span></span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>//added by my cvs</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>int mainexample()</span></span></p>
            <p align=left><span>　　<span>{//add</span></span></p>
            <p align=left><span>　　<span>printf("OK\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>接着用户<span>B</span>修改成如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　<span>int callby (int count)</span></span></p>
            <p align=left><span>　　<span>{//add</span></span></p>
            <p align=left><span>　　<span>printf("ExcelStor!\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>void main(int argv,char *argc)</span></span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>//modified</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            <p align=left><span>　　<span>int mainexample()</span></span></p>
            <p align=left><span>　　<span>{//add</span></span></p>
            <p align=left><span>　　<span>printf("OK\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>当用户<span>B</span>选择<span>&#8220;Commit Selection&#8221;</span>时将提示： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>cvs server: Up-to-date check failed for `example.h'</span></p>
            <p align=left><span>　　<span>cvs [server aborted]: correct above errors first!</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>此时表明已经有用户对同一个文件<span>example.h</span>进行修改并提交到<span>CVS</span>服务器，这时要先选择<span>&#8220;Update Selection&#8221;</span>对本地<span>example.h</span>与<span>CVS</span>服务器上的<span>example.h</span>文件进行同步与合并，不用选中出现的任何选项，直接选择<span>&#8220;OK&#8221;</span>，这时将显示如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>cvs -z9 update example.h (in directory C:\my cvs\STW\src\)</span></p>
            <p align=left><span>　　<span>RCS file: /home/cvsroot/STW/src/example.h,v</span></span></p>
            <p align=left><span>　　<span>retrieving revision 1.5</span></span></p>
            <p align=left><span>　　<span>retrieving revision 1.6</span></span></p>
            <p align=left><span>　　<span>Merging differences between 1.5 and 1.6 into example.h</span></span></p>
            <p align=left><span>　　<span>M example.h </span></span></p>
            <p align=left><span>　　</span></p>
            <p align=left><span>　　<span>***** CVS exited normally with code 0 *****</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>表明用户<span>B</span>与用户<span>A</span>的修改已经合并成功，同时文件<span>example.h</span>的图标也将变成红色，合并后的文件是存放在用户<span>B</span>的本地机上，为了更新到<span>CVS</span>服务器还必须选中<span>example.h</span>并右击选择<span>&#8220;Commit Selection&#8221;</span>才能把用户<span>A</span>与用户<span>B</span>的修改合并后的结果提交到<span>CVS</span>服务器上。注：<span>M</span>表示此文件已经被修改过。 </span></p>
<p align=left><span>c)</span><span>、两个或两个以上的用户对同一个文件的相同部分进行修改的情况 </span></p>
<p align=left><span>这种情况就是如用户<span>A</span>与用户<span>B</span>都下载了文件<span>example.h</span>，内容如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>void main(int argv,char *argc)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>然后用户<span>A</span>把文件修改成如下，并提交到<span>CVS</span>服务器（一般将正常提交）： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>void main(int argv,char *argc)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>printf("I am Pat\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>接着用户<span>B</span>又把文件修改成如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>void main(int argv,char *argc)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>printf("I love you Cather\n");</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>如果用户<span>B</span>这时选择<span>&#8220;Commit Selection&#8221;</span>准备把修改结果提交到<span>CVS</span>服务器，此时将显示如下的错误提示： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>cvs -z9 commit -m "update in 11:20" example.h (in directory C:\my cvs\STW\src\)</span></p>
            <p align=left><span>　　<span>cvs server: Up-to-date check failed for `example.h'</span></span></p>
            <p align=left><span>　　<span>cvs [server aborted]: correct above errors first!</span></span></p>
            <p align=left><span>　　</span></p>
            <p align=left><span>　　<span>***** CVS exited normally with code 1 *****</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>表明用户<span>B</span>的修改与其它用户的修改冲突，这时要先选择<span>&#8220;Update Selection&#8221;</span>，将显示如下提示： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>　<span>cvs -z9 update example.h (in directory C:\my cvs\STW\src\)</span></span></p>
            <p align=left><span>　　<span>RCS file: /home/cvsroot/STW/src/example.h,v</span></span></p>
            <p align=left><span>　　<span>retrieving revision 1.9</span></span></p>
            <p align=left><span>　　<span>retrieving revision 1.10</span></span></p>
            <p align=left><span>　　<span>Merging differences between 1.9 and 1.10 into example.h</span></span></p>
            <p align=left><span>　　<span>rcsmerge: warning: conflicts during merge</span></span></p>
            <p align=left><span>　　<span>cvs server: conflicts found in example.h</span></span></p>
            <p align=left><span>　　<span>C example.h</span></span></p>
            <p align=left><span>　　</span></p>
            <p align=left><span>　　<span>***** CVS exited normally with code 0 *****</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>example.h</span><span>前面的<span>C</span>表示与其它用户的修改有冲突，并且文件的图标会加显示一个<span>&#8220;C&#8221;</span>，双击<span>example.h</span>将显示<span>example.h</span>的内容，如下： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>void main(int argv,char *argc)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("I am Yanxi\n");</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>&lt;&lt;&lt;&lt;&lt;&lt;&lt; example.h</span></span></p>
            <p align=left><span>　　<span>printf("I love you Yanxi,too!\n"); //</span>这部分为你的修改</span></p>
            <p align=left><span>　　<span>=======</span></span></p>
            <p align=left><span>　　<span>printf("I love you Cather!\n"); //</span>这部分为其它用户的修改</span></p>
            <p align=left><span>　　<span>&gt;&gt;&gt;&gt;&gt;&gt;&gt; 1.10</span></span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>这时你应该与用户<span>A</span>进行协商以决定最终要怎样修改。比如，可以修改成： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>void main(int argv,char *argc)</span></p>
            <p align=left><span>　　<span>{</span></span></p>
            <p align=left><span>　　<span>printf("I am Yanxi\n");</span></span></p>
            <p align=left><span>　　<span>printf("I am Cather\n");</span></span></p>
            <p align=left><span>　　<span>printf("I love you Yanxi,too!\n"); //</span>这部分为你的修改</span></p>
            <p align=left><span>　　<span>printf("I love you Cather!\n"); //</span>这部分为其它用户的修改</span></p>
            <p align=left><span>　　<span>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>然后选择<span>&#8220;Commit Selection&#8221;</span>进行提交，将显示如下的提示信息： </span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=400 border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>cvs -z9 commit -m "update in 11:20" example.h (in directory C:\my cvs\STW\src\)</span></p>
            <p align=left><span>　　<span>Checking in example.h;</span></span></p>
            <p align=left><span>　　<span>/home/cvsroot/STW/src/example.h,v &lt;-- example.h</span></span></p>
            <p align=left><span>　　<span>new revision: 1.11; previous revision: 1.10</span></span></p>
            <p align=left><span>　　<span>done</span></span></p>
            <p align=left><span>　　</span></p>
            <p align=left><span>　　<span>***** CVS exited normally with code 0 *****</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span>表明用户<span>A</span>与用户的修改已经合并成功。这样，向<span>CVS</span>服务器提交文件所会遇到的问题也基本上就是这些，用户要根据所遇到的实际问题进行修改。 </span></p>
<p align=left><strong><span>7</span></strong><strong><span>、 向<span>CVS</span>服务器添加新文件</span></strong><span> </span></p>
<p align=left><span>在本地添加文件后，要提交到服务端。先选中文件，然后点击<span>&#8220;</span>添加按钮<span>&#8221;</span>，添加文件后，再在右键菜单中选择提交命令<span>&#8220;Commit Selection&#8221;</span>即可。选中文件<span>example.h.bak</span>，因为<span>example.h.bak</span>当前不是<span>CVS</span>的文件，此时<span>&#8220;</span>添加按钮<span>&#8221;</span>将由不可选状态变成可选状态，所以<span>Status</span>中显示为<span>&#8220;NonCvs file&#8221;</span>，选择<span>&#8220;</span>添加按钮<span>&#8221;</span>之后<span>example.h.bak</span>图标将变成红色并增加了一个<span>A</span>字母，如下： </span></p>
<p align=left><span>然后选中<span>example.h.bak</span>，右击，选择<span>&#8220;Commit Selection&#8221;</span>把文件<span>example.h.bak</span>提交到<span>CVS</span>服务器上而成为<span>CVS</span>的一个文件。 </span></p>
<p align=left><strong><span>8</span></strong><strong><span>、 结束语</span></strong><span> </span></p>
<p align=left><span>来到这里，你基本上已经能为自己或公司配置一个实用的<span>CVS</span>服务器与<span>WinCVS</span>客户端，配合使用<span>CVS</span>进行系统开发或其它文档的版本管理与控制。 </span></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/27371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-05-21 14:12 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux常用基本操作</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20631.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 11:32:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20631.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20631.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20631.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20631.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 软件的安装																																																								 								　　				Linux				下软件的安装主要有两种不同的形式。第一种安装文件名为				xxx.tar.gz				；另一种安装文件名为				xxx.i386.rpm				。...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20631.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-16 19:32 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux指令大全</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20630.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 11:29:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20630.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20630.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20630.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20630.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux指令大全																																						（														1																																						）																																																																								...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20630.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-16 19:29 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>