73 lines
1.2 KiB
Bash
Executable File
73 lines
1.2 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
DIR="$(dirname "$0")"
|
|
|
|
SCRIPT="$1"
|
|
SHELL="$2"
|
|
|
|
if [ ! -x "$SCRIPT" ]
|
|
then
|
|
>&2 echo "First argument should be file with kill_child_jobs() function to test."
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v "$SHELL" >/dev/null
|
|
then
|
|
>&2 echo "Second argument should be shell to test."
|
|
exit 1
|
|
fi
|
|
|
|
TMP="$(mktemp)"
|
|
|
|
|
|
|
|
# timeout code from https://stackoverflow.com/a/10028986
|
|
pidFile="$(mktemp)"
|
|
(
|
|
"$SHELL" "$DIR/make-and-kill-child-jobs.sh" "$SCRIPT" >"$TMP" 2>&1 || true
|
|
rm "$pidFile"
|
|
) &
|
|
pid=$!
|
|
echo $pid > "$pidFile"
|
|
(
|
|
sleep 1
|
|
if [ -e "$pidFile" ]
|
|
then
|
|
pkill -P $pid
|
|
printf '∞'
|
|
fi
|
|
) &
|
|
killerPid=$!
|
|
|
|
wait $pid
|
|
kill $killerPid 2>/dev/null || true
|
|
rm -f "$pidFile" || true
|
|
|
|
# Make sure we've waited long enough for the "outlived" messages to be generated.
|
|
sleep 0.1s
|
|
|
|
if grep -q '^shell does not support disown$' "$TMP"
|
|
then
|
|
printf 'X'
|
|
fi
|
|
|
|
if ! grep -q '^disowned outlived parent.$' "$TMP"
|
|
then
|
|
# disowned should have outlived parent
|
|
EXITCODE=2
|
|
printf '☠'
|
|
elif grep -q '^job outlived parent.$' "$TMP"
|
|
then
|
|
# job should not outlive parent
|
|
EXITCODE=3
|
|
printf '🏃'
|
|
else
|
|
# all good
|
|
EXITCODE=0
|
|
printf '✔️'
|
|
fi
|
|
|
|
rm -f "$TMP"
|
|
exit $EXITCODE
|