#!/bin/bash
THREAD_NUM=60 #允許的進(jìn)程數(shù)
rm tmp
mkfifo tmp
exec 9<>tmp #定義描述符為9的管道
#預(yù)先寫入指定數(shù)量的換行符,一個(gè)換行符代表一個(gè)進(jìn)程
for ((i=0;i<$THREAD_NUM;i++))
do
echo -ne "\n" 1>&9
done
#獲取參數(shù)文件
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
rm tmp
exit -1;
fi
#循環(huán)讀取文件內(nèi)容
while read line
do
{
#進(jìn)程控制
read -u 9
{
# echo $line 需要執(zhí)行的程序
chmod -R 777 $line
echo -ne "\n" 1>&9 #進(jìn)程控制原理是通過管道實(shí)現(xiàn)的算灸,當(dāng)管道無內(nèi)容可讀時(shí)就不會(huì)執(zhí)行
}&
}
done < $1
wait
echo "執(zhí)行結(jié)束"
rm tmp
以下是 通譯千問 寫的多線程shell腳本
#!/bin/bash
# 定義一個(gè)函數(shù)來處理每個(gè)子任務(wù)
function process_task() {
# 這里替換為實(shí)際要執(zhí)行的任務(wù)
echo "Processing task: $1"
sleep 2 # 示例:暫停幾秒代表進(jìn)行某種計(jì)算或IO操作
}
# 定義任務(wù)列表
tasks=("Task 1" "Task 2" "Task 3" "Task 4" "Task 5" "Task 6" "Task 7" "Task 8")
# 初始化一個(gè)計(jì)數(shù)器和隊(duì)列
count=0
queue=()
# 循環(huán)遍歷任務(wù)列表扼劈,并將任務(wù)放入隊(duì)列
for task in "${tasks[@]}"; do
queue+=( "$task" )
done
# 啟動(dòng)并管理后臺(tái)進(jìn)程,保持不超過4個(gè)并發(fā)進(jìn)程
while [ ${#queue[@]} -gt 0 ]; do
if [ "$count" -lt 4 ]; then
process_task "${queue[0]}" &
queue=( "${queue[@]:1}" ) # 移除已開始的任務(wù)
(( count++ ))
else
wait -n # 等待一個(gè)后臺(tái)進(jìn)程完成
(( count-- ))
fi
done
# 確保所有剩余的后臺(tái)進(jìn)程完成
while [ "$count" -gt 0 ]; do
wait -n
(( count-- ))
done
echo "All tasks have finished."
這個(gè)腳本會(huì)按照不超過4個(gè)并發(fā)進(jìn)程的數(shù)量依次啟動(dòng)任務(wù)菲驴,并在新任務(wù)啟動(dòng)前等待已有任務(wù)結(jié)束荐吵。這樣可以實(shí)現(xiàn)對(duì)并發(fā)進(jìn)程數(shù)量的控制。