From: Ian Kelling Date: Thu, 10 Nov 2022 19:46:04 +0000 (-0500) Subject: handle race condition X-Git-Url: https://iankelling.org/git/?p=log-quiet;a=commitdiff_plain;h=af60b670d9960388b63ba6a1d8541b4cf312f5ca handle race condition --- diff --git a/log-once b/log-once index 3aa3c76..3532110 100755 --- a/log-once +++ b/log-once @@ -6,7 +6,7 @@ append() { cat >> "$1" } log-once() { - local cbase c log line i out file o tmp + local cbase c log line i out file o tmp mvout mverr cbase=/var/local/cron-errors [[ $EUID == 0 ]] || cbase=$HOME/cron-errors local help="Usage: some-command-that-outputs-on-error |& log-once [OPTION]... LOG_NAME @@ -30,6 +30,7 @@ I could imagine a similar command that considers its non-option args to be an error, but I haven't written it yet. " errors=3 + mverr=0 while true; do if [[ $1 == --help ]]; then echo "$help" @@ -69,7 +70,17 @@ be an error, but I haven't written it yet. i="${file#$c}" if (( i < errors )); then new_file=$c$((i+1)) - mv $file $new_file + mvout=$(mv $file $new_file 2>&1) || mverr=$? + if (( mverr )); then + if [[ $mvout == *": No such file or directory" ]]; then + # We've very likely hit a race condition, where another + # log-once did the mv before us. + return 0 + else + echo "log-once: error on mv $file $new_file" + return $mverr + fi + fi file=$new_file if [[ $file == $c$errors ]]; then out="tee -a"