#!/usr/bin/env bash insert_date() { while read do local date_value date_value="$(date +"%b %d %T %s.%N")" echo "${date_value} ${REPLY}" done } fatal_error_handler() { local result="$?" local p_message="$1" local pid="${BASHPID}" (exit "${result}") || { ( cd "${BASH_SOURCE[1]%/*}" echo -n "${FUNCNAME[0]}: $(echo | insert_date)${PWD}/${BASH_SOURCE[1]##*/}:${BASH_LINENO[0]} ${FUNCNAME[1]}() PID(${pid})" ) [ "${p_message}" != "" ] && echo -n " ${p_message}" echo return "${result}" } >&2 } execute_with_retry() { local p_max_try_count="$1" shift false local result="$?" local try_number=0 while ((try_number < p_max_try_count)) do echo "Execute command($@): try #$((try_number+1))/${p_max_try_count}" >&2 "$@" && return result="$?" sleep 1 ((++try_number)) done return "${result}" } get_own_process_group() { local ps_output ps_output=($(ps --no-heading -o pgrp "$$")) || fatal_error_handler || return [ "${#ps_output[@]}" = "1" ] || fatal_error_handler || return echo "${ps_output[0]}" }