Guest

bash flock protected logging v3

Jan 7th, 2026
17
0
Never
Not a member of gistpad yet? Sign Up, it unlocks many cool features!
Bash 10.08 KB | Software | 0 0
  1. #!/bin/bash
  2.  
  3. stdin_logger() {
  4.  
  5. local log_file="$1"
  6. local lock_file="$log_file.lock"
  7. local LOG_FD
  8. local line
  9. local logbuffer=()
  10. local counter=0
  11. local buffer_size=1000
  12.  
  13. trap "stdin_logger_flush $log_file $lock_file" EXIT INT HUP TERM
  14.  
  15. while IFS= read -r line ; do
  16. logbuffer+=("$line")
  17. ((counter++))
  18.  
  19. if [ $counter -ge $buffer_size ] ; then
  20. stdin_logger_flush "$log_file" "$lock_file"
  21. fi
  22.  
  23. done
  24. stdin_logger_flush "$log_file" "$lock_file"
  25. }
  26.  
  27. stdin_logger_flush() {
  28.  
  29. local log_file="$1"
  30. local lock_file="$2"
  31.  
  32. [ -z "$counter" ] && return
  33.  
  34. # $logfile bei Bedarf oeffnen
  35. [ -n "$LOG_FD" ] || exec {LOG_FD}<>$lock_file
  36.  
  37. dbg "logbuffer flush, logbuffer_count: ${#logbuffer} counter: ${counter}"
  38. local i
  39. if flock --exclusive --timeout 10 $LOG_FD ;then
  40. for((i=0;i<$counter;i++));do
  41. dbg "writing line >${logbuffer[$i]}< ..."
  42. echo "${logbuffer[$i]}" >>$log_file
  43. done
  44. logbuffer=()
  45. counter=0
  46. flock --unlock $LOG_FD
  47. fi
  48. }
  49.  
  50. dbg() {
  51. # Debug ausgabe am Bildschirm
  52. if [ "$DEBUG" == "1" ] ;then
  53. echo "DEBUG: $*" >&2
  54. fi
  55. }
  56.  
  57. machwas() {
  58. local i=0
  59. for((x=1;x<=10;x++)) ; do
  60. for name in anton peter "" susanne fritz mira markus tina ;do
  61. echo "$name"
  62. done
  63. done
  64.  
  65. }
  66.  
  67. # --- Hauptprogramm ---
  68.  
  69. declare -x DEBUG=1
  70.  
  71. # - mehrere logger definieren -
  72. #
  73. logger_data() { stdin_logger data.log ; }
  74. logger_extra() { stdin_logger extra.log ; }
  75.  
  76. machwas | logger_data
  77. machwas | logger_extra
RAW Gist Data Copied