#!/usr/bin/env bash # Copyright Epic Games, Inc. All Rights Reserved. set -eu UNAMEOS="$(uname -s)" ADDRESS="127.0.0.1" PORT="8000" URL="http://$ADDRESS:$PORT/GPUDumpViewer.html" SCRIPT=$(readlink -f "$0") # Absolute path this script is in, thus /home/user/bin SCRIPTPATH=$(dirname "$SCRIPT") pushd "$SCRIPTPATH" GetAllChildProcesses() { local Children=$(ps -o pid= ppid "$1") for PID in $Children do GetAllChildProcesses "$PID" done echo "$Children" } # Gather all the descendant children of this process, and first kill -TERM. If any child process # is still alive finally send a -KILL TermHandler() { MaxWait=30 CurrentWait=0 ProcessesToKill=$(GetAllChildProcesses $$) kill -s TERM $ProcessesToKill 2> /dev/null ProcessesStillAlive=$(ps -o pid= -p $ProcessesToKill) # Wait until all the processes have been gracefully killed, or max Wait time while [ -n "$ProcessesStillAlive" ] && [ "$CurrentWait" -lt "$MaxWait" ] do CurrentWait=$((CurrentWait + 1)) sleep 1 ProcessesStillAlive=$(ps -o pid= -p $ProcessesToKill) done # If some processes are still alive after MaxWait, lets just force kill them if [ -n "$ProcessesStillAlive" ]; then kill -s KILL $ProcessesStillAlive 2> /dev/null fi } # trap when SIGINT or SIGTERM are received with a custom function trap TermHandler SIGTERM SIGINT APPS=() APPS+=(xdg-open) if [[ "${UNAMEOS}" =~ "Darwin" ]]; then APPS+=(open) fi CMD= for val in "${APPS[@]}"; do CMD="$(command -v "${val}")" || true if [[ -n "${CMD}" ]]; then break fi done if [[ -z "${CMD}" ]]; then echo "ERROR: Browser launch command not found" exit 1 fi ARGS=("${CMD}") ARGS+=("$URL") echo "Executing:" echo echo "Starting simple webserver..." exec python3 -m http.server "$PORT" --bind "$ADDRESS" & P1=$! sleep 1 echo "${ARGS[0]} \\" for ((i=1; i < ${#ARGS[@]}; i++ )); do echo " ${ARGS[$i]} \\"; done echo # Start the browser now that the server is running "${ARGS[@]}" # Wait on the webserver - in general this will be killed by a Ctrl-C wait $P1 echo echo "Closing ${CMD}..." popd