From af60b670d9960388b63ba6a1d8541b4cf312f5ca Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Thu, 10 Nov 2022 14:46:04 -0500 Subject: [PATCH] handle race condition --- log-once | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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" -- 2.30.2