歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Bash多進程批量處理

首先看需求:

同時控制1000台Linux服務器做同一件事。

怎麼辦?肯定用腳本批量處理,因為我目前還沒有1000台Linux,所以我們用一些腳本來模擬。

1.首先模擬我需要做的事,假設我處理一台Linux需要費時5s 那麼我的模擬腳本如下:

cat nothing.sh
#!/bin/bash
sleep 5        //發呆5秒
echo `date`    //輸出當前系統日期
    好,那麼這件事我要做1000次,那麼for循環走起:
#!/bin/bash
for i in `seq 1000`
do
sh nothing.sh
done
exit 0

運行的時候,你會發現每過5s 輸出了1行 date 的值,我們循環了1000次,那這個腳本執行完需要的時間至少是1000*5s 大約等於1個半小時。由於循環是串行的,腳本必須等待上一條循環結束,才能進行下一步的循環。

這個時候我們就有需求了:

我肯定不能等那麼久,既然現在的CPU都是多進程的,我能不能開多個進程去同時完成我需要的任務呢?答案是肯定的。

一個新的多進程並發腳本:

#!/bin/bash
tmp_fifofile="/tmp/$$.fifo"   
mkfifo $tmp_fifofile            //新建一個fifo類型的文件
exec 6<>$tmp_fifofile        //將標示符(fd6)指向fifo類型文件
rm -rf $tmp_fifofile            //可刪可不刪

thread=1000                //這裡定義了我需要多個進程去干活
for ((i=0;i<$thread;i++)) 
do
echo ""
done >&6        //就是在fd6中放置了$thread個空行

for ((i=0;i<1000;i++))        //1000次循環,開了1000個進程
do
read -u6        // 一次read -u6 就從fd6中去掉一個空行,然後向下執行,如果fd6中的空行沒有了,就停在這裡等待位置,從而實現了進程數量的控制。所以如果 我thread的值設為50個,那麼其實我就是在用這50個進程就干活,如果進程開滿了,就不會再開新的進程,如果舊的進程結束了,那麼就會有新的進程進來繼續干活。
        {
        sh nothing.sh        //這裡是我需要干什麼活
        echo "">&6            //每個進程結束後,向fd6返回一個空行,告訴它, 我的活干完了,我的位置騰出來。
        } &            //命令是放在後台執行的
done
wait            //等待所有後台進程結束
exec 6>&-    //關閉fd6

exit 0

這樣的話我們,如果按照我上面的腳本,就是開了1000個進程去同時執行nothing.sh腳本,那麼我們總共花費的時間,其實也就是一個進程執行的時間,大約5.5s 。相比於1個半小時,我們節約了太多的時間。

(下一篇將帶來Python版 http://www.linuxidc.com/Linux/2015-01/112362.htm)

注意:如果你的系統設置了進程上限,請使用 ulimit -s unlimited 來更改為無限制。

Linux下獲取電腦硬件配置信息的bash腳本代碼 http://www.linuxidc.com/Linux/2014-11/109285.htm

bash的登錄與歡迎信息:/etc/issue,/etc/motd  http://www.linuxidc.com/Linux/2014-08/105419.htm

Bash常用的幾個配置文件 http://www.linuxidc.com/Linux/2014-08/105202.htm

Bash腳本15分鐘進階教程 http://www.linuxidc.com/Linux/2014-04/100750.htm

10個 Linux/Unix下 Bash 和 KSH shell 的作業控制實例 http://www.linuxidc.com/Linux/2014-03/98159.htm

Ubuntu下shell腳本運行異常:Bash和dash的區別 http://www.linuxidc.com/Linux/2013-10/91100.htm

Bash腳本之for語句if語句以及各種測試語句 http://www.linuxidc.com/Linux/2013-07/87922.htm

什麼是Bash Shell的內建(build in)命令 http://www.linuxidc.com/Linux/2013-06/86039.htm

分享有用的 bash 別名和函數  http://www.linuxidc.com/Linux/2015-01/111178.htm

Copyright © Linux教程網 All Rights Reserved