#!/bin/bash stdin_logger() { local log_file="$1" local lock_file="$log_file.lock" local LOG_FD local line local logbuffer=() local counter=0 local buffer_size=1000 trap "stdin_logger_flush $log_file $lock_file" EXIT INT HUP TERM while IFS= read -r line ; do logbuffer+=("$line") ((counter++)) if [ $counter -ge $buffer_size ] ; then stdin_logger_flush "$log_file" "$lock_file" fi done stdin_logger_flush "$log_file" "$lock_file" } stdin_logger_flush() { local log_file="$1" local lock_file="$2" [ -z "$counter" ] && return # $logfile bei Bedarf oeffnen [ -n "$LOG_FD" ] || exec {LOG_FD}<>$lock_file dbg "logbuffer flush, logbuffer_count: ${#logbuffer} counter: ${counter}" local i if flock --exclusive --timeout 10 $LOG_FD ;then for((i=0;i<$counter;i++));do dbg "writing line >${logbuffer[$i]}< ..." echo "${logbuffer[$i]}" >>$log_file done logbuffer=() counter=0 flock --unlock $LOG_FD fi } dbg() { # Debug ausgabe am Bildschirm if [ "$DEBUG" == "1" ] ;then echo "DEBUG: $*" >&2 fi } machwas() { local i=0 for((x=1;x<=10;x++)) ; do for name in anton peter "" susanne fritz mira markus tina ;do echo "$name" done done } # --- Hauptprogramm --- declare -x DEBUG=1 # - mehrere logger definieren - # logger_data() { stdin_logger data.log ; } logger_extra() { stdin_logger extra.log ; } machwas | logger_data machwas | logger_extra