仅使用gawk 5能否实现并行启动shell命令且无需等待执行完成?
仅使用gawk 5完全可以实现该需求,你之前的写法未生效是因为缺少输出重定向步骤。
问题原因
你在命令末尾加&已经实现了shell层面的后台执行,但command | getline是通过管道读取命令的标准输出,只要有任意进程持有该管道的写端,getline就会阻塞直到所有写端关闭。你没有重定向后台命令的输出时,后台子进程会继续持有管道写端,导致getline仍处于等待状态,看起来就像没有后台运行一样。
正确实现方案
后台启动命令时,将命令的标准输出和标准错误都重定向到/dev/null(或指定的日志文件),确保父shell退出后没有进程持有管道写端,getline就会立刻返回,不会阻塞。
示例代码如下:
BEGIN { # 命令后台运行,同时重定向所有标准输出、错误输出 command1 = "{ echo start >> test1.log ; sleep 10 ; echo stop >> test1.log ; } >/dev/null 2>&1 &" command1 | getline # 主动关闭管道清理资源 close(command1) command2 = "{ echo start >> test2.log ; sleep 10 ; echo stop >> test2.log ; } >/dev/null 2>&1 &" command2 | getline close(command2) print "terminated" }
验证方法
运行该gawk脚本会立刻打印terminated并退出,等待10秒后查看test1.log和test2.log,可看到start和stop记录都已正常写入,说明两个后台进程在gawk退出后仍正常运行。
注意事项
- 若你的后台命令需要保留输出,可将
>/dev/null 2>&1替换为对应日志路径,比如>mycommand.log 2>&1即可。 - 每次执行完命令后主动调用
close(command)是好习惯,可避免占用过多文件句柄。
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

