如何维护固定大小的nohup作业队列,实现最多同时运行4个作业并自动触发后续作业?
如何维护固定大小的nohup作业队列,实现最多同时运行4个作业并自动触发后续作业?
这个需求我太熟了!平时跑批量后台任务的时候经常要控制并发数,给你分享几个靠谱的实现方法:
方案一:纯Shell脚本手动控制进程数(无需额外工具)
如果不想装新工具,自己写个小脚本就能搞定。核心思路是:把所有要执行的任务存成列表,循环检查当前运行的任务数量,只要没到4个就启动下一个,定期轮询状态。
举个例子脚本:
# 把所有要运行的任务放到数组里,每个元素是完整的nohup命令 tasks=( "nohup python script1.py > log1.out 2>&1" "nohup python script2.py > log2.out 2>&1" "nohup python script3.py > log3.out 2>&1" "nohup python script4.py > log4.out 2>&1" "nohup python script5.py > log5.out 2>&1" # 还能继续加更多任务 ) max_concurrent=4 for task in "${tasks[@]}"; do # 统计当前正在运行的目标任务数(这里用python script作为过滤标记,你要根据自己的任务调整) running_jobs=$(ps aux | grep -E "python script[0-9]+\.py" | grep -v grep | wc -l) # 如果当前任务数已经满了,就等10秒再检查一次 while [ $running_jobs -ge $max_concurrent ]; do sleep 10 running_jobs=$(ps aux | grep -E "python script[0-9]+\.py" | grep -v grep | wc -l) done # 启动新任务 echo "开始执行任务: $task" eval $task & done # 等待最后一批任务全部完成 wait
注意点:过滤进程的grep规则要准确,避免把其他无关进程算进去。比如你的任务是Java程序,就把过滤条件改成java -jar your-app.jar这类特征字符串。
方案二:用wait命令精准监控进程结束
如果任务数量不算特别多,可以用wait -n命令来监控第一个结束的进程,然后立刻启动下一个,不用轮询,效率更高。
示例代码:
# 先启动前4个任务,记录每个进程的PID nohup python script1.py > log1.out 2>&1 & pid_list=($!) nohup python script2.py > log2.out 2>&1 & pid_list+=($!) nohup python script3.py > log3.out 2>&1 & pid_list+=($!) nohup python script4.py > log4.out 2>&1 & pid_list+=($!) # 剩下的任务列表 remaining_tasks=( "nohup python script5.py > log5.out 2>&1" "nohup python script6.py > log6.out 2>&1" ) for task in "${remaining_tasks[@]}"; do # 等待任意一个进程结束 wait -n "${pid_list[@]}" # 移除已经结束的PID(这里简单处理,实际可以更精准筛选,不过一般不影响) pid_list=($(ps -p "${pid_list[@]}" -o pid=)) # 启动新任务并加入PID列表 echo "启动新任务: $task" eval $task & pid_list+=($!) done # 等待所有剩余任务完成 wait "${pid_list[@]}"
这个方法的好处是不用定期sleep轮询,只要有进程结束就立刻触发新任务,响应更及时。
方案三:用GNU Parallel一键搞定(最省心)
如果系统允许装工具,GNU Parallel绝对是最佳选择——它专门用来控制并行任务数,自带队列管理,完全不用自己写复杂逻辑。
使用步骤:
先安装工具(大部分Linux发行版都有包):
# Debian/Ubuntu sudo apt install parallel # CentOS/RHEL sudo yum install parallel把所有任务整理成一行一个命令的文本文件(比如
tasks.txt):nohup python script1.py > log1.out 2>&1 nohup python script2.py > log2.out 2>&1 nohup python script3.py > log3.out 2>&1 nohup python script4.py > log4.out 2>&1 nohup python script5.py > log5.out 2>&1执行命令,指定最多4个并行任务:
parallel -j 4 < tasks.txt
或者直接在命令行生成任务,比如你的任务是有规律的:
parallel -j 4 "nohup python script{}.py > log{}.out 2>&1" ::: 1 2 3 4 5 6
Parallel会自动帮你维护队列,一个任务结束就启动下一个,还能帮你处理日志、错误捕获,非常好用。
备注:内容来源于stack exchange,提问作者Sheng Yang
相关产品推荐
相关产品推荐

