如何从单个Bash脚本启动多独立PID的ChanDataStream_Sim实例?
批量并行启动ChanDataStream_Sim进程的修改方案
核心修改:让进程后台独立运行
原脚本串行执行的原因是每个ChanDataStream_Sim命令会阻塞循环,直到进程被手动终止。只需在命令末尾加上&,就能让每个进程在后台独立启动,循环会立刻处理下一个通道:
#!/bin/bash # 所有需要模拟数据流的通道 channels=(3002 1001 4003) # 模拟数据的优先级 priority=(IDLE REALTIME HIGH) # 绑定的守护进程ID objserv=(83 82 81) length=${#channels[@]} for (( i=0; i<$length; i++ )) do # 启动后台进程,每个实例拥有独立PID ChanDataStream_Sim ${channels[$i]} -d -p ${priority[$i]} -s ${objserv[$i]} & done # 可选:如果需要脚本等待所有后台进程结束再退出,取消下面一行的注释 # wait
进阶优化:解决会话中断导致进程停止的问题
如果当前SSH会话断开,后台运行的进程默认会被终止。可以用nohup让进程脱离会话,同时给每个通道单独生成日志文件,方便后续排查:
#!/bin/bash channels=(3002 1001 4003) priority=(IDLE REALTIME HIGH) objserv=(83 82 81) length=${#channels[@]} for (( i=0; i<$length; i++ )) do chan=${channels[$i]} # 用通道号命名日志文件,输出和错误都写入日志 nohup ChanDataStream_Sim $chan -d -p ${priority[$i]} -s ${objserv[$i]} > ./chan_${chan}_log.out 2>&1 & echo "已启动通道$chan,PID为 $!" done
修改后每个进程会在后台持续运行,即使SSH断开也不会停止,日志会保存在当前目录下的chan_XXX_log.out文件里,启动时还会打印每个进程的PID,方便后续手动终止。
内容的提问来源于stack exchange,提问作者NanoNet
相关产品推荐
相关产品推荐

