bash實現多程序執行

2022-04-29 17:51:10 字數 944 閱讀 2940

之前一段時間,發現線上日誌伺服器總是會突然丟失日誌,碰到問題時搞的很被動。聯絡運維同學,又總是被往後推(後來看了一下日誌歸檔指令碼,運維同學寫的bug)。索性自己寫了乙個指令碼,新增到crontab任務中,替換運維同學的指令碼。

線上伺服器每天大概產生6000-10000個日誌檔案(部分級別的日誌),每個檔案99m。壓縮時考慮到盡可能多保留日誌,gzip設定的9,壓縮比最大、但是最慢的壓縮演算法。如果以單個程序來慢慢壓縮、按天歸檔,日誌較多時,一天都歸不完。所以肯定要多個程序壓縮。

bash中,把任務放到後台執行就可以實現『多程序』。不過,線上伺服器不能影響到其它服務執行,必須限制程序個數,所以用了乙個令牌池來限制程序數。

#!/bin/bash

date=`date -d '2 days ago' +%y-%m-%d`

declare -a files

files=`find /data1/error/error-$_* -type f`

npro=10 #並行10個子程序壓縮

pfifo="/tmp/$$.fifo"

mkfifo $pfifo # 新建乙個fifo型別的檔案

exec 6<>$pfifo # 將fd 6指向該檔案

rm -f $pfifo

for((i=1; i<=$npro; i++)); do

echo

done >&6 # 在fd 6指向的檔案中放置$npro個回車符,作為令牌

for file in $files

do read -u6 #從fd 6中讀出減去乙個回車符,然後向下執行

#如果fd 6中沒有回車符了,程序阻塞在這兒

& #花括號體內的程式後台執行

done

wait

exec 6>&- #關閉fd6

wait命令表示等待前面的後台任務全部完成後才繼續往下執行。

shell多程序執行

shell在linux中,是使用者和kernel溝通的橋梁,採用c編寫,既是一種命令語言,也是一種解釋型指令碼語言,我們常寫的ls,grep就是基本的shell命令。shell指令碼是將要執行的命令按一定順序寫成的乙個文字檔案,最近遇到乙個需求,要將一定數量的命令快速執行,而每次執行都需要一定的時間...

多程序執行(限制程序數)

多程序執行 限制程序數 from ctypes import import os import multiprocessing import time,datetime import multiprocessing as np deftestdll wide,tele dll cdll os.get...

shell執行 shell多程序執行

shell在linux中,是使用者和kernel溝通的橋梁,採用c編寫,既是一種命令語言,也是一種解釋型指令碼語言,我們常寫的ls,grep就是基本的shell命令。cat test.txt grep abc abc.txt 將test.txt所有包含abc的行提取到abc.txt中多個處理都這樣來...