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)
105 lines
3.5 KiB
Bash
Executable File
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"
|