aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron LI <aly@aaronly.me>2019-03-07 20:40:43 +0800
committerAaron LI <aly@aaronly.me>2019-03-07 20:40:43 +0800
commit7af8539b4fb56d720a0495743ad6b2b0ef4745f5 (patch)
tree4a7cb325af9f0a059523ebc941a07924f5a0df42
parent8ec9862f63f21d7227fc54b7c211e50d2dfd77f7 (diff)
downloadatoolbox-7af8539b4fb56d720a0495743ad6b2b0ef4745f5.tar.bz2
unix/waiton.sh: Rewrite to support multiple processes
-rwxr-xr-xunix/waiton.sh120
1 files changed, 97 insertions, 23 deletions
diff --git a/unix/waiton.sh b/unix/waiton.sh
index 988d3d3..0689106 100755
--- a/unix/waiton.sh
+++ b/unix/waiton.sh
@@ -1,29 +1,103 @@
#!/bin/sh
#
-# Wait for a UNIX process to finish
-# Jon Cairns
-# http://blog.joncairns.com/2013/03/wait-for-a-unix-process-to-finish/
-# 2013-03-20
+# Copyright (c) 2018-2019 Aaron LI <aly@aaronly.me>
+# MIT License
#
+# Wait for process(s) to finish ...
+#
+# Credit: http://blog.joncairns.com/2013/03/wait-for-a-unix-process-to-finish/
+#
+
+me="${0##*/}"
+
+has_proc() {
+ ps -p $1 >/dev/null 2>&1
+}
+
+get_proc_cmd() {
+ if has_proc $1; then
+ ps -p $1 -o args=
+ else
+ echo "(not found)"
+ return 1
+ fi
+}
+
+usage() {
+ cat <<_EOF_
+
+Wait for process(s) to finish ...
+
+usage:
+ ${me} [-t interval] <pid1> [<pid2> ...]
+
+options:
+ -t : number of seconds between every check.
+ (default: 5)
+
+example:
+ ${me} 123 456 && command ...
-case "$1" in
- -h|--help|"")
- echo "usage: ${0##*/} <pid>" >&2
- exit 1
+_EOF_
+ exit 1
+}
+
+
+interval=5
+while getopts :ht: opt; do
+ case ${opt} in
+ h)
+ usage
+ ;;
+ t)
+ interval="${OPTARG}"
+ ;;
+ \?)
+ echo "${me}: invalid option -${OPTARG}"
+ usage
+ ;;
+ :)
+ echo "${me}: option -${OPTARG} requires an argument"
+ usage
;;
-esac
-
-pid="$1"
-me="${0##*/} (pid=$$)"
-name=$(ps -p ${pid} -o args=)
-if [ $? -eq 0 ]; then
- echo "${me}: waiting for process (pid=${pid}, ${name}) to finish ..."
- while ps -p ${pid} >/dev/null 2>&1; do
- echo -n .
- sleep 3
+ esac
+done
+
+shift $((${OPTIND} - 1))
+[ $# -eq 0 ] && usage
+
+echo "${me}: waiting for following process(s) to finish ..."
+pids="$@"
+nwait=0
+for p in ${pids}; do
+ cmd=$(get_proc_cmd ${p})
+ ret=$?
+ echo "* [pid: ${p}] ${cmd}"
+ if [ ${ret} -eq 0 ]; then
+ nwait=$((${nwait} + 1))
+ eval _has_${p}=yes
+ fi
+done
+
+echo -n "${me}: "
+while [ ${nwait} -ne 0 ]; do
+ nwait=0
+ for p in ${pids}; do
+ key="_has_${p}"
+ eval last=\$${key}
+ if has_proc ${p}; then
+ nwait=$((${nwait} + 1))
+ eval ${key}=yes
+ elif [ -n "${last}" ]; then
+ echo
+ echo "${me}: pid=${p} exited."
+ echo -n "${me}: "
+ eval ${key}=
+ fi
done
- echo
-else
- echo "${me}: failed to find process with PID ${pid}" >&2
- exit 2
-fi
+ echo -n "${nwait}."
+ sleep ${interval}
+done
+
+echo "done"
+exit 0