dotfiles/eggs/utility/util-scripts/ensure_app_is_running.sh

77 lines
1.7 KiB
Bash

#!/usr/bin/env bash
TMP_FILE=/tmp/ensure_running.json
BOOT_ID=$(cat /proc/sys/kernel/random/boot_id)
data=$(cat "$TMP_FILE")
prep_tmp_if_needed() {
if [ ! -f "$TMP_FILE" ]; then
echo "{ \"boot_id\": \"$BOOT_ID\", \"entries\": [], \"running_pids\": {} }" > "$TMP_FILE"
fi
data=$(cat "$TMP_FILE")
data_bid=$(jq -r '.boot_id' <<< $data)
if [[ "$data_bid" == "" || "$data_bid" != "$BOOT_ID" ]]; then
rm $TMP_FILE
prep_tmp_if_needed
return
fi
}
run() {
prep_tmp_if_needed
while read -r e; do
existing_pid=$(jq -r --arg k "$e" '.running_pids[($k)]?' <<< "$data")
if [[ $existing_pid != "null" && "$(ps -p $existing_pid -o pid --no-headers)" != "" ]]; then
continue
fi;
bash -lc "$e" &
pid=$!
data=$(jq --arg k "$e" --arg v "$pid" \
'.running_pids += {($k): $v}' <<< "$data")
done < <(jq -r '.entries[]' <<< "$data")
echo "$data" > "$TMP_FILE"
}
register() {
prep_tmp_if_needed
data=$(jq --arg val "$*" '.entries += [$val]' <<< "$data")
data=$(jq '.entries |= unique' <<< "$data")
echo "$data" > "$TMP_FILE"
}
remove() {
prep_tmp_if_needed
diff=$data
data=$(jq --arg val "$*" '.entries -= [$val]' <<< "$data")
if [ "$diff" = "$data" ]; then
echo "Element to remove was not found"
exit 1
fi
echo "$data" > "$TMP_FILE"
}
list() {
jq -C <<< "$data"
}
i=1
for arg in "$@"; do
i=( $i+1 )
case $arg in
run) run; exit 0; ;;
register)
register "${@:i}"; exit 0; ;;
remove)
remove "${@:i}"; exit 0; ;;
list) list; exit 0; ;;
*)
echo "Unsuported: $arg"; exit 1 ;;
esac
done