#!/bin/bash
+#############
+# VARIABLES #
+#############
+TIMEOUT__dflt=3
+SCR_BN=`basename $0`
+
#############
# FUNCTIONS #
#############
-_exit () {
+_exit() {
echo -e "\n$1\n"
exit 1
}
+usage() {
+ echo
+ echo "Usage: $0 [-h|--help] [-t|--timeout <value>] [-f|--file] [-p|--ping] <data>"
+ echo
+ echo " -h|--help: this usage help."
+ echo " -t|--timeout: timeout for operation in seconds."
+ echo " Defaults to $TIMEOUT__dflt seconds if not provided."
+ echo
+ echo " -f|--file: the parameter 'data' will be interpreted as a file"
+ echo " with one operation per line. If missing, it will be"
+ echo " a single operation string."
+ echo
+ echo " -p|--ping: Check the target process id."
+ echo " Returns 1 (dead) or 0 (alive)."
+ echo
+ echo " data: operation string or file with several operations."
+ echo
+ echo " For example:"
+ echo " $0 help"
+ echo " $0 \"test|ttps|50\""
+ echo " $0 --file myOperationsList.txt"
+ echo " $0 --timeout 10 --file ./bigList.txt"
+ _exit
+}
+
+parse_arguments() {
+ is_file=
+ timeout=$TIMEOUT__dflt
+ data=
+ ping=
+
+ while [ $# -gt 0 ]; do
+ case $1 in
+ -h|--help)
+ usage
+ ;;
+
+ -t|--timeout)
+ timeout=$2
+ [ -z "$timeout" ] && _exit "Missing timeout value"
+ shift
+ ;;
+
+ -f|--file)
+ is_file=yes
+ data=$2
+ [ -z "$data" ] && _exit "Missing file"
+ [ ! -f "$data" ] && _exit "Can't found provided file '$data'."
+ shift
+ ;;
+
+ -p|--ping)
+ ping=yes
+ ;;
+
+ *)
+ first=$(echo $1 | cut -c1)
+ [ "$first" = "-" ] && _exit "Unsupported script option: $1. Type '$SCR_BN -h' (or --help) to print the available options."
+ data=$1
+ ;;
+ esac
+ shift
+ done
+
+ [ -z "$ping" -a -z "$data" ] && _exit "Missing data value"
+}
+
+# $1: pid to check
+check_pid() {
+ kill -0 $1 2>/dev/null
+ return $?
+}
+
#############
# EXECUTION #
#############
[ ! -f .pid ] && _exit "Can't found '`pwd`/.pid'.\nTry to pgrep your process name and dump pid to that file."
PID=`cat .pid`
-# Send operation:
-[ "$1" = "" ] && _exit "Usage: $0 [-f] <content: operation string or file (one operation per line) if '-f' provided>; i.e.: $0 help, $0 -f myOperationsList.txt"
-FILE=
-[ "$1" = "-f" ] && FILE=$2
+# Arguments:
+[ "$1" = "" -o "$1" = "--help" -o "$1" = "-h" ] && usage
+parse_arguments $@
+
+# Check pid:
+check_pid $PID
+res=$?
+[ -n "$ping" ] && exit $res
+[ $res -ne 0 ] && _exit "Operation error: missing process with pid $PID"
-if [ -z "$FILE" ]
+# Send operation:
+if [ -n "$is_file" ]
then
- echo $1 > sigusr2.in
+ cp $data sigusr2.in
else
- [ ! -f "$FILE" ] && _exit "Can't found provided file '$FILE'."
- grep -v "^#" $FILE | sed '/^[ \t]*$/d' > sigusr2.in
+ echo $data > sigusr2.in
fi
-0> sigusr2.out
+0>sigusr2.out
+check_pid $PID
kill -s SIGUSR2 $PID
+
# Detect EOF and print all except that last line:
-while [ -z "$(tail -1 sigusr2.out | grep ^EOF)" ]; do sleep 0.1; done
-head --lines=-1 `pwd`/sigusr2.out
+count=$((10*timeout))
+expired=yes
+while [ $count -gt 0 ]
+do
+ sleep 0.1
+ count=$((count-1))
+ if tail -1 sigusr2.out | grep "^EOF" >/dev/null; then
+ expired=
+ break;
+ fi
+done
+
+if [ -z "$expired" ]
+then
+ head --lines=-1 sigusr2.out
+else
+ _exit "Operation error: timeout expired ($timeout seconds)"
+fi
+
+exception=$(grep "^Operation processed with exception: " sigusr2.out)
+[ $? -eq 0 ] && _exit "(detected 'exception' within operation output: see 'launcher.trace')"
+exit 0