Guest

bash flock protected logging

Jan 7th, 2026
13
10
Never
Not a member of gistpad yet? Sign Up, it unlocks many cool features!
Bash 10.18 KB | Source Code | 1 0
  1. #!/bin/bash
  2.  
  3. mylogger() {
  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 "mylog_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. mylog_flush "$log_file" "$lock_file"
  21. fi
  22.  
  23. done
  24. mylog_flush "$log_file" "$lock_file"
  25. }
  26.  
  27. mylog_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. rm -f $lock_file
  47. flock --unlock $LOG_FD
  48. fi
  49. }
  50.  
  51. dbg() {
  52. # Debug ausgabe am Bildschirm
  53. if [ "$DEBUG" == "1" ] ;then
  54. echo "DEBUG: $*" >&2
  55. fi
  56. }
  57.  
  58. machwas() {
  59. local i=0
  60. for((x=1;x<=10;x++)) ; do
  61. for name in anton peter "" susanne fritz mira markus tina ;do
  62. echo "$name"
  63. done
  64. done
  65.  
  66. }
  67.  
  68. # --- Hauptprogramm ---
  69.  
  70. declare -x DEBUG=1
  71.  
  72. # - mehrere logger definieren -
  73. #
  74. logger_data() { mylogger data.log ; }
  75. logger_extra() { mylogger extra.log ; }
  76.  
  77. machwas | logger_data
  78. machwas | logger_extra
RAW Gist Data Copied