1. 程式人生 > >shell後臺併發執行的最佳實踐

shell後臺併發執行的最佳實踐

一、shell如何在後臺執行1.nohup命令通常我們都是遠端登入linux終端,而當我們退出終端時在之前終端執行的程式都會終止,有時候先想要退出終端也要程式繼續執行這時nohup就登場了。nohup命令可以將程式以忽略掛起訊號的方式執行起來,被執行的程式的輸出資訊將不會顯示到終端。nohup command > myout.file 2>&1 &2.&後臺執行在命令後面加 & 可以讓程式在後臺執行command &3.Ctrl + z當一個程式正在執行並且佔用當前終端時我們同時按下 Ctrl + z ,這樣就會把正在執行的前臺程式放到後臺掛起。
二、常規併發執行1.正常執行
#!/bin/bash
Njob=15    #任務總數
for ((i=0; i<$Njob; i++)); do
{
          echo  "progress $i is sleeping for 3 seconds zzz…"
          sleep  3
}
done
echo -e "time-consuming: $SECONDS    seconds"    #顯示指令碼執行耗時

2.併發後臺執行
#!/bin/bash
Njob=15
for ((i=0; i<$Njob; i++)); do
          echo  "progress $i is sleeping for 3 seconds zzz…"
          sleep  3 &       #迴圈內容放到後臺執行
done
wait      #等待迴圈結束再執行wait後面的內容
echo -e "time-consuming: $SECONDS    seconds"    #顯示指令碼執行耗時

以這種方式進行後臺執行執行的效率較高、速度快,但是當併發數過多時就有可能會造成系統奔潰。3.以佇列方式併發後臺執行

就上面的併發執行的缺點,我們可以分批並行的方式併發執行。每批的執行程序數固定並不會引起系統奔潰。

#!/bin/bash                                                                                    
NQ=3                                                                                                           
num=5                                                                                                        
for ((i=0; i<$NQ; i++)); do                                                                              
     for ((j=0; j<$num; j++)); do                                                                    
         echo  "progress $i is sleeping for 3 seconds zzz…"                
        sleep 3 &               
     done                
     wait               
 done             
#等待迴圈結束再執行wait後面的內容               
echo -e "time-consuming: $SECONDS    seconds"    #顯示指令碼執行耗時  


三、最佳實踐以佇列的形式併發執行固然很好,每次併發的程序是可控的,可以提高效率還能防止系統奔潰。但是存在一個問題就是每一批的併發程序的執行時間是由這些程序裡面執行最慢的決定,先前執行完的程序要等待沒有執行完的程序。下面介紹併發執行的最佳實踐
able File  45 lines (37 sloc)  696 Bytes
#!/bin/bash
# 併發執行的最佳實踐

# 總程序數
Sp=15
# 併發數,併發數過大可能造成系統崩潰
Qp=5
# 存放程序的佇列
Qarr=();
# 執行程序數
run=0
# 將程序的新增到佇列裡的函式
function push() {
	Qarr=(${Qarr[@]} $1)
	run=${#Qarr[@]}
}
# 檢測佇列裡的程序是否執行完畢
function check() {
	oldQ=(${Qarr[@]})
	Qarr=()
	for p in "${oldQ[@]}";do
		if [[ -d "/proc/$p" ]];then
			Qarr=(${Qarr[@]} $p)	
		fi
	done
	run=${#Qarr[@]}
}

# main
for((i=0; i<$Sp; i++));do
	echo "running $i " 
	sleep 3 &
	push $!
	while [[ $run -gt $Qp ]];do
		check
		sleep 0.1
	done
done
echo -e "time-consuming: $SECONDS   seconds"    #顯示指令碼執行耗時

大家可以看見同樣是可控併發數量,總數量同為15個程序,每次都併發執行5個程序,效率提高了進30%。


本篇文章主要參考了:微信公眾號上的一篇文章《Shell指令碼實現併發多程序》,但是具體連結我忘記了。

相關推薦

shell後臺併發執行最佳實踐

一、shell如何在後臺執行1.nohup命令通常我們都是遠端登入linux終端,而當我們退出終端時在之前終端執行的程式都會終止,有時候先想要退出終端也要程式繼續執行這時nohup就登場了。nohup命

編寫Shell腳本的最佳實踐

enc odin mes ood 執行權限 print 自己 syn name   前言   由於工作需要,最近重新開始拾掇shell腳本。雖然絕大部分命令自己平時也經常使用,但是在寫成腳本的時候總覺得寫的很難看。而且當我在看其他人寫的腳本的時候,總覺得難以閱讀

shell下變數比較最佳實踐

https://stackoverflow.com/questions/13617843/unary-operator-expected   If you know you're always going to use bash, it's much easier to always use t

Java多執行併發最佳實踐

使用本地變數 儘量使用本地變數,而不是建立一個類或例項的變數。 使用不可變類 String、Integer等。不可變類可以降低程式碼中需要的同步數量。 最小化鎖的作用域範圍:S=1/(1-a+a/n) a:平行計算部分所佔比例 n:並行處理結點個數 S:加速比 當1-a等於0時,沒有序列只有並

Java執行緒安全策略與多執行併發最佳實踐

  執行緒安全策略 不可變物件 不可變物件(Immutable Objects)是指物件一旦被建立它的狀態(

執行併發最佳實踐

1、使用本地區域性變數; 2、使用不可變類 3、最小化鎖的作用範圍; 4、使用Excutor而不是thread; 5、寧可

Shell指令碼中併發執行緒以及併發數的控制

http://blog.chinaunix.net/uid-8478094-id-3995108.html Shell指令碼中併發執行緒以及併發數的控制 主要記錄一下Shell指令碼中的命令的併發和序列執行。 預設的情況下,Shell指令碼中的命令是序列執行的,必須等到前一條命令

SSIS最佳實踐:SQL Server提升執行效能

SQL Server整合服務(SQL Server Integration Services,SSIS)在其前輩DTS(Data Transformation Services,資料轉換服務)的基礎上進步了不少,從可用性、效能和並行等方面來說,它已經成長為一個企業級ETL(Extractio

執行無間:阿里巴巴運維保障體系的一種最佳實踐

本文根據 GOPS2017·上海站演講《阿里巴巴運維保障體系的一種最佳實踐》整理髮布 前言 阿里巴巴全球執行指揮中心,GOC (Global Operations Center)保障阿里經濟體的業務穩定執行的核心團隊。我們負責了整個阿里巴巴全域性生產系統的穩定性。就像業界經常提到谷歌的SRE,我們

Android 6.0 執行時許可權管理最佳實踐

這是一篇遲來的部落格,Android M已經發布一年多了(6.0的變化),在Android M中許可權系統被重新設計,發生了顛覆性的變化,很多人把握不好這個變化,一是對這個許可權策略和套路還沒有摸透,二是沒有一個很好的實踐來支撐,在我的技術開發群裡很多人問我

OpenResty(Nginx+Lua)高併發最佳實踐

文章目錄 OpenResty簡介 Nginx優點 Lua基礎學習 環境搭建 window下環境搭建 Linux(CentOS 7)下環境搭建

shell 後臺執行以及隱藏指令碼中呼叫其他指令碼隱藏輸出

例如:A.sh要後臺呼叫B.sh ,要隱藏B.sh中的輸出。(後臺執行符號"&"要寫在隱藏語句“> /dev/null 2>&1 "的後面) B.sh #===================== #!/bin/bash echo “this

第42課: Spark Broadcast內幕解密:Broadcast執行機制徹底解密、Broadcast原始碼解析、Broadcast最佳實踐

第42課:  Spark Broadcast內幕解密:Broadcast執行機制徹底解密、Broadcast原始碼解析、Broadcast最佳實踐Broadcast在機器學習、圖計算、構建日常的各種演算法中到處可見。 Broadcast就是將資料從一個節點發送到其它的節點上;

深入理解Java虛擬機器JVM高階特性與最佳實踐閱讀總結—— 第十二章 Java記憶體模型與執行

Java記憶體模型JMM,主要目標是定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體讀取變數的底層細節,這裡的變數不包括執行緒私有的變數,如區域性引數;記憶體模型規定所有變數儲存在主記憶體;每個執行緒都有自己的工作記憶體,其中儲存了該執行緒用到的變數

最佳實踐--Spring容器初始化完成之後執行某個方法

在做javaweb專案的時候,當用戶訪問的時候需要從資料庫載入資料,現在要在容器初始化完成之後直接把資料放入快取,當用戶訪問的時候提高速度。 查閱相關spring文件,找到了一個最佳實踐(best p

CMS gc實踐總結(糾正併發執行緒數)

首先感謝阿寶同學的幫助,我才對這個gc演算法的調整有了一定的認識,而不是停留在過去僅僅瞭解的階段。在讀過sun的文件和跟阿寶討論之後,做個小小的總結。    CMS,全稱Concurrent Low Pause Collector,是jdk1.4後期版本開始引入的新gc演算

shell佇列實現執行併發控制

1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash start_time=`date +%s` #定義指令碼執行的開始時間 for ((i=1;i<=10

shell後臺執行指令cron和crontab

當你在終端或控制檯工作時,可能不希望由於執行一個作業而佔住了螢幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對於密集訪問磁碟的程序,你可能希望它能夠在每天的非負荷高峰時間段執行。為了使這些程序能夠在後臺執行,也就是說不在終端螢幕上執行,有幾種選擇方法可供使用。 • 設定crontab檔案,並用它來提

App 後臺架構設計方案 設計思想與最佳實踐

做App做的久了,就想研究一下與之相關的App後臺,發現也是蠻有趣的。App後臺的兩個重要作用就是 遠端儲存資料 和 訊息中轉。這裡面的知識體系也是相當複雜,做好一個App後臺也是需要長期錘鍊的。本篇文章從 App 後臺架構 的角度介紹。好了,下面進入正題: 說起架構

​結合非同步模型,再次總結Netty多執行緒編碼最佳實踐

更多技術分享可關注我 前言 本文重點總結Netty多執行緒的一些編碼最佳實踐和注意事項,並且順便對Netty的執行緒排程模型,和非同步模型做了一個彙總。原文:​​結合非同步模型,再次總結Netty多執行緒編碼最佳實踐 Netty多執行緒編碼的最佳實踐總結 接該文:Netty的執行緒排程模型分析(10)《