proc.sh 976 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. # waitterm
  2. # wait TERM/INT signal.
  3. # see: http://veithen.github.io/2014/11/16/sigterm-propagation.html
  4. waitterm() {
  5. local PID
  6. # any process to block
  7. tail -f /dev/null &
  8. PID="$!"
  9. # setup trap, could do nothing, or just kill the blocker
  10. trap "kill -TERM ${PID}" TERM INT
  11. # wait for signal, ignore wait exit code
  12. wait "${PID}" || true
  13. # clear trap
  14. trap - TERM INT
  15. # wait blocker, ignore blocker exit code
  16. wait "${PID}" 2>/dev/null || true
  17. }
  18. # waittermpid "${PIDFILE}".
  19. # monitor process by pidfile && wait TERM/INT signal.
  20. # if the process disappeared, return 1, means exit with ERROR.
  21. # if TERM or INT signal received, return 0, means OK to exit.
  22. waittermpid() {
  23. local PIDFILE PID do_run error
  24. PIDFILE="${1?}"
  25. do_run=true
  26. error=0
  27. trap "do_run=false" TERM INT
  28. while "${do_run}" ; do
  29. PID="$(cat "${PIDFILE}")"
  30. if ! ps -p "${PID}" >/dev/null 2>&1 ; then
  31. do_run=false
  32. error=1
  33. else
  34. sleep 1
  35. fi
  36. done
  37. trap - TERM INT
  38. return "${error}"
  39. }