blob: e87afde1ddc8e49ac7bc1b86fddbc88cdd74bfc0 [file] [log] [blame]
Tom Jonesc3b416c2024-01-18 14:51:44 +00001#!/usr/bin/env bash
Klement Sekera94384e42017-07-11 07:29:37 +02002
3rv=0
4
Andrew Yourtchenko3efd4e92021-03-04 16:56:38 +00005# Minimalist version of cleanup, used for signal handling.
6# Sends a SIGKILL to the entire process group, including ourselves.
7# Needs just two external commands, making it more
8# robust in case of resource issues.
9panic() {
10 echo "$0(pid $$): Caught a signal, emergency clean-up"
11 # use "pgid:1=" output format to get unpadded process group ID
12 group_id=`ps -p $$ -o pgid:1=`
13 echo "$0(pid $$): sending kill to process group ID:${group_id}"
14 kill -9 -- -${group_id}
15 # not reached
16}
17
18# Happy camper leisurely clean up - send the signal only to other
19# processes in the process group, and also check
20# that the processes exists before sending the signal.
Klement Sekera94384e42017-07-11 07:29:37 +020021atexit() {
22 group_id=`ps -p $$ -o pgid=`
23 my_id=$$
Matthew Smithb4832512024-04-02 18:27:19 +000024 SED=`which gsed`
25 SED=$(basename "${SED:-sed}")
26 ids=`pgrep -g $group_id -d ' ' | ${SED} "s/\b$my_id\b//g"`
Klement Sekera94384e42017-07-11 07:29:37 +020027 echo "Killing possible remaining process IDs: $ids"
28 for id in $ids
29 do
30 if ps -p $id > /dev/null
31 then
32 kill -9 $id
33 fi
34 done
Klement Sekera8712ada2017-08-16 16:38:10 +020035 exit ${rv}
Klement Sekera94384e42017-07-11 07:29:37 +020036}
37
Andrew Yourtchenko3efd4e92021-03-04 16:56:38 +000038trap "panic;" SIGINT SIGTERM
Klement Sekera94384e42017-07-11 07:29:37 +020039
Klement Sekeradb4e84c2017-08-11 10:06:15 +020040FORCE_FOREGROUND=$1
41shift
42
43source $1
44shift
45
46if [[ "${FORCE_FOREGROUND}" == "1" ]]
47then
48 $*
49else
50 $* &
Klement Sekera8712ada2017-08-16 16:38:10 +020051 pid=$!
52 wait ${pid}
Klement Sekeradb4e84c2017-08-11 10:06:15 +020053fi
54
Klement Sekera94384e42017-07-11 07:29:37 +020055rv=$?
56atexit
Klement Sekera8712ada2017-08-16 16:38:10 +020057exit ${rv}