77 lines
1.7 KiB
Bash
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
|