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
be an error, but I haven't written it yet.
"
errors=3
+ mverr=0
while true; do
if [[ $1 == --help ]]; then
echo "$help"
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"