#!/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