Skip to content

Instantly share code, notes, and snippets.

@matti
Created January 21, 2025 13:14
Show Gist options
  • Save matti/5216df95996848f894facd1dd0110910 to your computer and use it in GitHub Desktop.
Save matti/5216df95996848f894facd1dd0110910 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -eEuo pipefail
declare -A name_pid
declare -A name_start
(
echo "eka started"
sleep 1
) &
name_pid['eka']=$!
name_start['eka']=$SECONDS
(
echo "makkara started"
sleep 2
exit 0
) &
name_pid['makkara']=$!
name_start['makkara']=$SECONDS
(
echo "kekkonen started"
sleep 3
exit 1
) &
name_pid['kekkonen']=$!
name_start['kekkonen']=$SECONDS
(
echo "banaani started"
sleep 4
exit 123
) &
name_pid['banaani']=$!
name_start['banaani']=$SECONDS
(
echo "toka started"
sleep 8
) &
name_pid['toka']=$!
name_start['toka']=$SECONDS
(
echo "kolmas started"
sleep 999999
) &
name_pid['kolmas']=$!
name_start['kolmas']=$SECONDS
abort=no
while true; do
if [[ "$abort" == "yes" ]]; then
echo "Aborting"
for pid in "${name_pid[@]}"; do
kill $pid 2>/dev/null || true
done
break
fi
for name in "${!name_pid[@]}"; do
pid=${name_pid[$name]}
if ! kill -0 $pid 2>/dev/null; then
if wait $pid; then
exit_code=0
else
exit_code=$?
fi
echo "$name exited with code $exit_code"
echo "$name finished in $((SECONDS - name_start[$name])) seconds"
unset name_pid[$name]
unset name_start[$name]
elif (( SECONDS - name_start[$name] > 5 )); then
echo "$name is taking too long, abort everything"
abort=yes
break
fi
done
# Exit the loop if no processes remain
if [[ ${#name_pid[@]} -eq 0 ]]; then
break
fi
sleep 1
done
if [[ "$abort" == "yes" ]]; then
echo "Aborted"
else
echo "All done"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment