also sprach Jakub Wilk <[email protected]> [2009.06.26.1250 +0200]:
> > https://trac.madduck.net/pub/browser/bin/base/phoenix/
> The link is defunct...

It's attached.

-- 
 .''`.   martin f. krafft <[email protected]>      Related projects:
: :'  :  proud Debian developer               http://debiansystem.info
`. `'`   http://people.debian.org/~madduck    http://vcs-pkg.org
  `-  Debian - when you have better things to do than fixing systems
 
"a woman is like your shadow;
 follow her, she flies;
 fly from her, she follows."
                                    -- sébastien-roch-nicolas chamfort
#!/bin/sh -eu
#
# phoenix -- respawns a process unless the user really wants to quit
#
# Copyright © martin f. krafft <[email protected]>
# Released under the terms of the Artistic Licence 2.0
#
# Latest version:
#   http://svn.madduck.net/pub/bin/base/phoenix
#
# Revision: $Id: phoenix 318 2006-10-25 07:32:04Z madduck $
#

PROGNAME="${0##*/}"

about()
{
  echo "$PROGNAME -- respawn a process unless the user really wants to quit"
  echo '$Id: phoenix 318 2006-10-25 07:32:04Z madduck $'
  echo "Copyright © martin f. krafft <[email protected]>"
  echo "Released under the terms of the Artistic Licence 2.0"
}

usage()
{
  about
  echo
  echo "Usage: $PROGNAME [options] [--] [command [arguments]]"
  echo
  echo "Valid options are:"
  cat <<-_eof | column -s\& -t
        -m|--max & set maximum number of respawns.
        -q|--quiet & suppress informational messages.
        -h|--help & show this output.
        -V|--version & show version information.
        _eof
}

exit_with_error()
{
  local ret=1
  case "$1" in
    *[!0-9-]*) :;;
    *-|-|?-*) :;;
    *) 
      ret=$1;
      [ $ret -lt 0 ] && ret=$((256 + $ret)) || :
      shift;;
  esac
  echo "E: $PROGNAME: $@" >&2
  exit $ret
}

info()
{
  [ ${quiet:-0} -eq 0 ] || return 0
  echo "I: $PROGNAME: $@" >&2
}

cmd=''
quiet=0
skiprest=0
max=-1
for i in "$@"; do
  if [ $skiprest -eq 0 ]; then
    case "${getopt:-}" in
      max) max=$i; unset getopt; continue;;
    esac

    case "$i" in
      -q|--quiet) quiet=1; continue;;
      --max=*[!0-9]*) exit_with_error 1 "invalid argument: $i";;
      --max=[0-9]*) max=${i#--max=}; continue;;
      -m*[!0-9]*) exit_with_error 1 "invalid argument: $i";;
      -m[0-9]*) max=${i#-m}; continue;;
      -m|--max) getopt=max; continue;;
      -h|--help) usage; exit 0;;
      -V|--version) about; exit 0;;
      *) skiprest=1;;
    esac
  fi

  cmd="${cmd:+$cmd }$i"
done

[ $max -eq 0 ] && exit 0

eval set -- $cmd

case "$(readlink $(command -v $1))$(command -v $1)" in
  */dash|dash|dash/bin/sh)
    exit_with_error -1 "mysteriously, $PROGNAME does not work with dash 
(#381878). Sorry."
    ;;
esac

# require a terminal
test -t 0 -a -t 1 -a -t 2 || exit_with_error 2 'not connected to a terminal.'

ret=0
info "Running '$@'..." >&2

while :; do
  max=$(($max - 1))

  eval "$@" || ret=$?

  [ $max -eq 0 ] && break

  echo -n 'The command finished. Please enter "yes" if you want to exit: '
  read ans || echo
  [ "$ans" = yes ] && break

  if [ $max -lt 0 ]; then
    info "Respawning '$@'..." >&2
    continue
  elif [ $max -eq 1 ]; then
    info "Respawning '$@' for the last time..." >&2
  else
    info "Respawning '$@' $max more times..." >&2
  fi
done

exit $ret

Attachment: digital_signature_gpg.asc
Description: Digital signature (see http://martin-krafft.net/gpg/)

Reply via email to