﻿<?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博客-System Administration Center-随笔分类-2 Shell</title><link>http://www.cnitblog.com/sysop/category/6536.html</link><description>It's so hard to say 'just for fun'.</description><language>zh-cn</language><lastBuildDate>Tue, 11 Oct 2011 16:25:59 GMT</lastBuildDate><pubDate>Tue, 11 Oct 2011 16:25:59 GMT</pubDate><ttl>60</ttl><item><title>bash实现“多进程”</title><link>http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 02 Nov 2008 16:58:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html</guid><description><![CDATA[<p>在bash中，使用后台任务来实现任务的&#8220;多进程化&#8221;。在不加控制的模式下，不管有多少任务，全部都后台执行。也就是说，在这种情况下，有多少任务就有多少&#8220;进程&#8221;在同时执行。我们就先实现第一种情况：</p>
<p>实例一：正常情况脚本</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/bin/bash</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">5</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">;echo&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">aa&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">done!</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>cat&nbsp;aa</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>rm&nbsp;aa</span></div>
<p>&nbsp;</p>
<p>这种情况下，程序顺序执行，每个循环3s，共需15s左右。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">$&nbsp;</span><span style="COLOR: #0000ff">time</span><span style="COLOR: #000000">&nbsp;bash&nbsp;test</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">5</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>real&nbsp;&nbsp;&nbsp;&nbsp;0m15</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">030s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>user&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">002s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">003s</span></div>
<p>&nbsp;</p>
<p>实例二：&#8220;多进程&#8221;实现</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/bin/bash</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">5</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">;echo&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">aa&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">done!</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>cat&nbsp;aa</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>rm&nbsp;aa</span></div>
<p>&nbsp;</p>
<p>这个实例实际上就在上面基础上多加了一个后台执行&amp;符号，此时应该是5个循环任务并发执行，最后需要3s左右时间。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">$&nbsp;</span><span style="COLOR: #0000ff">time</span><span style="COLOR: #000000">&nbsp;bash&nbsp;test</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">5</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>real&nbsp;&nbsp;&nbsp;&nbsp;0m3</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">011s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>user&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">002s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">004s</span></div>
<p>&nbsp;</p>
<p>效果非常明显。</p>
<p>这里需要说明一下wait的左右。wait是等待前面的后台任务全部完成才往下执行，否则程序本身是不会等待的，这样对后面依赖前面任务结果的命令来说就可能出错。例如上面wc -l的命令就报错：不存在aa这个文件。</p>
<p>wait命令的官方解释如下：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait&nbsp;[n]<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>Wait&nbsp;for&nbsp;the&nbsp;specified&nbsp;process&nbsp;and&nbsp;return&nbsp;its&nbsp;termination&nbsp;status.&nbsp;&nbsp;n&nbsp;may&nbsp;be&nbsp;a&nbsp;process&nbsp;ID&nbsp;or&nbsp;&nbsp;a&nbsp;&nbsp;job&nbsp;&nbsp;specification;&nbsp;if&nbsp;a&nbsp;job&nbsp;spec&nbsp;is&nbsp;given,&nbsp;all&nbsp;processes&nbsp;in&nbsp;that&nbsp;job's&nbsp;pipeline&nbsp;are&nbsp;waited&nbsp;for.&nbsp;&nbsp;If&nbsp;n&nbsp;is&nbsp;not&nbsp;given,&nbsp;all&nbsp;currently&nbsp;active&nbsp;child&nbsp;processes&nbsp;are&nbsp;waited&nbsp;for,&nbsp;and&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;zero.&nbsp;&nbsp;If&nbsp;&nbsp;n&nbsp;&nbsp;specifies&nbsp;&nbsp;a&nbsp;&nbsp;non-existent process&nbsp;&nbsp;or&nbsp;job,&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;127.&nbsp;&nbsp;Otherwise,&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;the&nbsp;exit&nbsp;status&nbsp;of&nbsp;the&nbsp;last&nbsp;processor&nbsp;job&nbsp;waited&nbsp;for.</span></div>
<p>&nbsp;</p>
<p>以上所讲的实例都是进程数目不可控制的情况，下面描述如何准确控制并发的进程数目。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/bin/bash<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;2006-7-12,&nbsp;by&nbsp;wwy<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#-----------------------------------------------------------------------------------<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;此例子说明了一种用wait、read命令模拟多线程的一种技巧<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;此技巧往往用于多主机检查，比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;还说明了多线程的控制<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#-----------------------------------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>function&nbsp;a_sub&nbsp;{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处定义一个函数，作为一个线程(子进程)</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;线程的作用是sleep&nbsp;3s</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">}<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>tmp_fifofile</span><span style="COLOR: #000000">=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">/tmp/$$.fifo</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>mkfifo&nbsp;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;新建一个fifo类型的文件</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;将fd6指向fifo类型</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">rm&nbsp;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>thread</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">15</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处定义线程数</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800080">$thread</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>echo<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;事实上就是在fd6中放置了$thread个回车符</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">50</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;50次循环，可以理解为50个主机，或其他</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">read</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">u6&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;一个read&nbsp;-u6命令执行一次，就从fd6中减去一个回车符，然后向下执行，<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;fd6中没有回车符的时候，就停在这了，从而实现了线程数量控制</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处子进程开始执行，被放到后台</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_sub&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处可以用来判断子进程的逻辑</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">a_sub&nbsp;is&nbsp;finished</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">sub&nbsp;error</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;当进程结束以后，再向fd6中加上一个回车符，即补上了read&nbsp;-u6减去的那个</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">}&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;等待所有的后台子进程结束</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&gt;&amp;-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;关闭df6</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exit</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>sleep 3s，线程数为15，一共循环50次，所以，此脚本一共的执行时间大约为12秒</p>
<p>即：<br>15x3=45, 所以 3 x 3s = 9s<br>(50-45=5)&lt;15, 所以 1 x 3s = 3s <br>所以 9s + 3s = 12s</p>
<p>$ time ./multithread.sh &gt;/dev/null </p>
<p>real&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m12.025s<br>user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m0.020s<br>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m0.064s</p>
<p><br>而当不使用多线程技巧的时候，执行时间为：50 x 3s = 150s。</p>
<p>此程序中的命令</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mkfifo&nbsp;tmpfile</span></div>
<p>和linux中的命令</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mknod&nbsp;tmpfile&nbsp;p</span></div>
<p>效果相同。区别是mkfifo为POSIX标准，因此推荐使用它。该命令创建了一个先入先出的管道文件，并为其分配文件标志符6。管道文件是进程之间通信的一种方式，注意这一句很重要</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;将fd6指向fifo类型</span></div>
<p>如果没有这句，在向文件<span style="COLOR: #800080">$tmp_fifofile<span style="COLOR: #000000">或者</span>&amp;6<span style="COLOR: #000000">写入数据时，程序会被阻塞，直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在<span style="COLOR: #7c1775"><strong>程序运行期间</strong></span>不断向fifo类型的文件写入数据而不会阻塞，并且数据会被保存下来以供read程序读出。</span></span><br></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/50974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-03 00:58 <a href="http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从windows传脚本到linux的格式问题</title><link>http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 02 Nov 2008 16:00:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html</guid><description><![CDATA[<p>从windows上传一个shell脚本到linux（通过linux下rz二进制方式传送），执行该脚本时出错：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;$</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000">\r</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;command&nbsp;not&nbsp;foundline&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;line&nbsp;</span><span style="COLOR: #800000">48</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;syntax&nbsp;error</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;unexpected&nbsp;end&nbsp;of&nbsp;file<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>查看文件发现，脚本总共才47行，根本没有48行。</p>
<p>怀疑是从windows传送文件时文件格式有问题，在windows下换行符为两个字符/r（回车）/n（换行），而在linux下换行符只需要一个字符/n，所以多出一个/r控制符。</p>
<p>在vim下set list，没有发现可以的控制字符，不知道怎么回事。</p>
<p>使用dos2unix对文件格式进行了调整：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">$&nbsp;dos2unix&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>dos2unix</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;converting&nbsp;file&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;to&nbsp;UNIX&nbsp;</span><span style="COLOR: #0000ff">format</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/dot.gif"></span></div>
<p>&nbsp;</p>
<p>格式化完毕后发现文件果然变了，</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rw</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;wangkun&nbsp;wangkun&nbsp;</span><span style="COLOR: #800000">1232</span><span style="COLOR: #000000">&nbsp;Nov&nbsp;&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">:</span><span style="COLOR: #800000">51</span><span style="COLOR: #000000">&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rw</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;wangkun&nbsp;wangkun&nbsp;</span><span style="COLOR: #800000">1281</span><span style="COLOR: #000000">&nbsp;Nov&nbsp;&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">:</span><span style="COLOR: #800000">45</span><span style="COLOR: #000000">&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">bk</span></div>
<p>&nbsp;</p>
<p>连大小都变了。又vim进去看了一下，还是没发现有什么不同。但diff了一下内容，发现内容全都显示出来，表明全都不同。</p>
<p>突发奇想，使用rz命令以ASIIC格式重新传了一下文件，竟然直接就可以执行了，<span>看来在windows和linux下传输脚本时选择<span style="COLOR: #ff0000">ASIIC格式传输</span>是比较保险的一种方式。</span></p>
<p><span></span>&nbsp;</p>
<img src ="http://www.cnitblog.com/sysop/aggbug/50972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-03 00:00 <a href="http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>