如何用Bash循环创建6个子进程并捕获PID到数组?赋值变量后命令失效
捕获子进程PID到数组的正确脚本写法
你的错误写法cid[$i]=./child2.sh &本质是把赋值操作后台执行,根本没运行child2.sh脚本。下面是正确实现:
基础版本脚本
#!/bin/bash # 初始化存储PID的空数组 cid=() # 循环创建6个子进程 for ((i=0; i<6; i++)); do # 后台启动子脚本 ./child2.sh & # 用$!捕获最后一个后台进程的PID,存入数组 cid[$i]=$! done # 可选:等待所有子进程执行完毕 wait # 打印所有捕获到的PID echo "子进程PID列表:${cid[@]}"
关键说明
./child2.sh &:让子脚本在后台运行,父进程无需等待即可继续执行后续代码$!:Shell内置特殊变量,始终指向最近启动的后台进程PID,正好用来捕获刚启动的子进程IDwait:如果需要父进程等所有子进程跑完再结束,加上这个命令,否则父进程会直接退出,不影响子进程运行
若要将子命令存入变量的写法
如果想把要执行的子命令预先存在变量中,避免重复书写,可这样写:
#!/bin/bash cid=() # 定义子进程命令(若有参数,建议用数组存储) child_script="./child2.sh" for ((i=0; i<6; i++)); do # 执行变量中的命令并后台运行 $child_script & cid[$i]=$! done wait echo "子进程PID列表:${cid[@]}"
如果子命令包含参数或特殊字符,更稳妥的方式是用数组存储命令:
#!/bin/bash cid=() # 用数组存储命令及参数,避免解析错误 child_cmd=(./child2.sh "arg with space" --option) for ((i=0; i<6; i++)); do "${child_cmd[@]}" & cid[$i]=$! done wait echo "子进程PID列表:${cid[@]}"
内容的提问来源于stack exchange,提问作者Kaleem Khattak
相关产品推荐
相关产品推荐

