watch_logs.sh 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/bin/bash
  2. usage() {
  3. local self="${0##*/}"
  4. local err=$1; shift
  5. echo >&2 "usage: $self DIR [DIR...]"
  6. echo >&2 ""
  7. echo >&2 "$err"
  8. exit 3
  9. }
  10. warn() {
  11. echo >&2 "$@"
  12. }
  13. die() {
  14. echo >&2 "$@"
  15. exit 3
  16. }
  17. list_files() {
  18. local dir
  19. for dir in "${Dirs[@]}"; do
  20. echo "$dir/root.log"
  21. seq -f "$dir/task-rep%02.0f.log" 0 3
  22. seq -f "$dir/task-cmd%02.0f.log" 0 9
  23. done
  24. }
  25. open_files() {
  26. local i=0
  27. local path=0
  28. for path in "$@"; do
  29. twinner -t "$path" -O "$Tmp/pid-$i" -P -c "tail -F \"$path\"" &
  30. sleep 0.1 # allow WM to have predictable order of windows
  31. ((i++))
  32. done
  33. }
  34. onclose() {
  35. warn ""
  36. warn "got SIGINT; killing: Pids=(${Pids[*]})"
  37. kill "${Pids[@]}"
  38. rm -r "$Tmp"
  39. }
  40. main() {
  41. test "$#" -eq 0 && usage "no DIRs?"
  42. local Dirs=("$@")
  43. local filelist=()
  44. local Pids=()
  45. local Tmp
  46. Tmp=$(mktemp -d /tmp/watch_logs.XXXXXXXX)
  47. list_files >"$Tmp/files"
  48. mapfile -t filelist <"$Tmp/files"
  49. open_files "${filelist[@]}"
  50. sleep 2
  51. cat "$Tmp/pid-"* > "$Tmp/pids"
  52. mapfile -t Pids <"$Tmp/pids"
  53. warn "spawned children: ${Pids[*]}"
  54. warn "press ^C to close all open files"
  55. wait # "${Pids[@]}"
  56. rm -r "$Tmp"
  57. }
  58. trap onclose SIGINT
  59. main "$@"