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?
这可以通过进程组(此处建议)完成并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)