Files
docker-steam-headless/overlay/usr/bin/sunshine-stop
Josh.5 771c47d602 Fix direct execution of AppImages
Fetch a list of all child PIDs before forwarding the termination signal.
Once the main process is terminated, forward that term signal to all found children also (if they are still running)
2023-09-11 12:21:23 +12:00

105 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
###
# File: sunshine-stop
# Project: bin
# File Created: Tuesday, 23rd August 2023 3:28:52 pm
# Author: Josh.5 (jsunnex@gmail.com)
# -----
# Last Modified: Friday, 23rd August 2023 4:21:00 pm
# Modified By: Josh.5 (jsunnex@gmail.com)
###
set -e
exec >> >(tee -a ${USER_HOME:?}/.cache/log/sunshine_stop.log) 2>&1
echo
echo "-------------------------------"
echo
date
echo
echo "-------------------------------"
echo
echo "**** Execute sunshine-stop ****"
echo
# Read the run config
if [ -f /tmp/sunshine-exec-run.conf ]; then
echo " - Reading sunshine-run config."
. /tmp/sunshine-exec-run.conf
else
echo " - WARNING: No sunshine-run config found for import."
fi
# Read the process PID
process_pid="$(cat /tmp/sunshine-exec-run.pid)"
echo " - Found initial sunshine-run PID '${process_pid}'."
# Send a INT signal to the PID
echo " - Sending SIGINT to PID '${process_pid}'."
kill -INT "${process_pid}" || true
sleep 1
# Run a loop to check for any other "sunshine-run" processes and send them also a INT signal
echo " - Checking for other sunshine-run processes..."
for process_pid in $(ps aux | grep -v grep | grep sunshine-run | awk '{print $2}'); do
# Ensure this process is still running
if ! kill -0 "$process_pid" 2>/dev/null; then
continue
fi
echo " - Stopping PID '${process_pid}' - $(ps -p ${process_pid} -o command | awk 'NR>1')"
# Send this process a SIGINT
echo " - Sending SIGINT to PID '${process_pid}'."
kill -INT "${process_pid}" 2>/dev/null || true
sleep 0.5
# Send this process a SIGTERM every 2 seconds util stopped or until it has sent 3 signals
counter=0
while kill -0 "$process_pid" 2>/dev/null; do
echo " - Sending SIGTERM to PID '${process_pid}'."
kill -TERM "$process_pid" 2>/dev/null || true
counter=$((counter + 1))
[ "$counter" -gt 2 ] && break
sleep 2
done
# Send this process a SIGKILL every second until stopped or until it has sent 3 signals
counter=0
while kill -0 "$process_pid" 2>/dev/null; do
echo " - Sending SIGKILL to PID '${process_pid}'."
kill -KILL "$process_pid" 2>/dev/null || true
counter=$((counter + 1))
[ "$counter" -gt 2 ] && break
sleep 1
done
if ! kill -0 "$process_pid" 2>/dev/null; then
echo " - PID '${process_pid}' stopped."
else
echo " - ERROR: Failed to kill PID '${process_pid}'."
fi
done
echo " - All sunshine-run related processes stopped."
# Check if the required information was stored for resetting the display resolution and refresh rate
if ([ "X${primary_output:-}" != "X" ] && [ "X${display_mode:-}" != "X" ] && [ "X${display_rate:-}" != "X" ]); then
# Reset display resolution and refresh rate
echo " - Resetting display resolution to ${display_mode:?} ${display_rate:?}Hz"
xrandr --output "${primary_output:?}" --mode "${display_mode:?}" --rate "${display_rate:?}"
else
echo " - WARNING: original display config not found. Resolution will not be reset."
fi
# Clean up config file
if [ -f /tmp/sunshine-exec-run.conf ]; then
echo " - Removing sunshine-run config."
rm -f /tmp/sunshine-exec-run.conf
else
echo " - WARNING: No sunshine-run config found for removal."
fi
# Clean up PID file
if [ -f /tmp/sunshine-exec-run.pid ]; then
echo " - Removing sunshine-run pidfile."
rm -f /tmp/sunshine-exec-run.pid
else
echo " - WARNING: No sunshine-run pidfile found for removal."
fi
echo "DONE"