如何将 SIGKILL 发送到整个管道?

Vi.*_*Vi. 7 bash kill pipe timeout

while true; do 
    # process substitution instead of usual pipeline to avoid waiting for all programs
    handle_input_with_timeout < <( prog1 | prog2 | prog3 )
    echo "Data stopped flowing. Trying again"
    # perminate stuck programs in previous pipeline, then try again
    sleep 5
done
Run Code Online (Sandbox Code Playgroud)

如何可靠地摆脱可能卡住并保留重试所需资源的 prog1、prog2 和 prog3?

可以单独在 Bash 中完成还是我需要使用 cgroups?

Vi.*_*Vi. 5

这可以通过进程组(此处建议)完成并setsid开始新的进程:

while true; do 

    handle_input_with_timeout < <( setsid bash -c '
          printf -- "-$$" > /tmp/saved_process_group.pid
          prog1 | prog2 | prog3
          ')
    echo "Data stopped flowing. Trying again"
    kill -9 $(< /tmp/saved_process_group.pid )

    sleep 5
done
Run Code Online (Sandbox Code Playgroud)