#!/bin/bash
THREAD_NUM=60 #允许的进程数
rm tmp
mkfifo tmp
exec 9<>tmp #定义描述符为9的管道
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=0;i<$THREAD_NUM;i++))
do
echo -ne "\n" 1>&9
done
#获取参数文件
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
rm tmp
exit -1;
fi
#循环读取文件内容
while read line
do
{
#进程控制
read -u 9
{
# echo $line 需要执行的程序
chmod -R 777 $line
echo -ne "\n" 1>&9 #进程控制原理是通过管道实现的,当管道无内容可读时就不会执行
}&
}
done < $1
wait
echo "执行结束"
rm tmp
以下是 通译千问 写的多线程shell脚本
#!/bin/bash
# 定义一个函数来处理每个子任务
function process_task() {
# 这里替换为实际要执行的任务
echo "Processing task: $1"
sleep 2 # 示例:暂停几秒代表进行某种计算或IO操作
}
# 定义任务列表
tasks=("Task 1" "Task 2" "Task 3" "Task 4" "Task 5" "Task 6" "Task 7" "Task 8")
# 初始化一个计数器和队列
count=0
queue=()
# 循环遍历任务列表,并将任务放入队列
for task in "${tasks[@]}"; do
queue+=( "$task" )
done
# 启动并管理后台进程,保持不超过4个并发进程
while [ ${#queue[@]} -gt 0 ]; do
if [ "$count" -lt 4 ]; then
process_task "${queue[0]}" &
queue=( "${queue[@]:1}" ) # 移除已开始的任务
(( count++ ))
else
wait -n # 等待一个后台进程完成
(( count-- ))
fi
done
# 确保所有剩余的后台进程完成
while [ "$count" -gt 0 ]; do
wait -n
(( count-- ))
done
echo "All tasks have finished."
这个脚本会按照不超过4个并发进程的数量依次启动任务,并在新任务启动前等待已有任务结束。这样可以实现对并发进程数量的控制。