Seu script parece funcionar como esperado. A saída de df
alcançou claramente $LOG_FILE
e exit 1
está fazendo o script sair.
Não sabemos o que faz o seu comando logging
, mas AFAICT, não se destina a gravar em $LOG_FILE
. Se fosse, seria um pouco bobo escrever Verifique o arquivo de log: $ {LOG_FILE} lá.
Editar
Agora que você postou a função logging
, posso ver que ela usa uma string aqui ( <<<
).
Em bash
, here-strings e here-documents são implementados usando arquivos temporários (em $TMPDIR
ou /tmp
if $TMPDIR
não está definido). Se esse fosse o sistema de arquivos que estava cheio, isso explicaria porque logging
não produziu nada.
$ sudo mount -o size=1 -t tmpfs empty /mnt/1
$ yes > /mnt/1/fill-up
yes: standard output: No space left on device
$ TMPDIR=/mnt/1 bash -c 'cat <<< test'
bash: cannot create temp file for here-document: No space left on device
Em vez de:
local now="$(date)"
cat <<< "${now} $@" | tee -a "${logfile}"
Use apenas:
printf '%(%FT%T%z)T %s\n' -1 "$*"
printf '%(%FT%T%z)T %s\n' -1 "$*" >> "$logfile"
Ou:
local msg
printf -v msg '%(%FT%T%z)T %s' -1 "$*"
printf '%s\n' "$msg"
printf '%s\n' "$msg" >> "$logfile"
(assume que $IFS
não está definido ou começa com espaço)
Isso salva o arquivo temporário, mas também evita a falsificação de qualquer processo ou a execução de qualquer comando externo (que também pode falhar sob algumas condições patológicas) (e oferece um formato de data mais útil, sinta-se à vontade para se adaptar).
Geralmente, um sistema com um sistema de arquivos / tmp e / var completo é um sistema danificado; é possível esperar que muitas coisas não funcionem adequadamente.
Aqui, você tem sorte de ter registros. O espaço em disco para arquivos é alocado em blocos (geralmente 4K em ext4), o que provavelmente é o motivo pelo qual você obteve alguma saída em '$ LOG_FILE (como o último bloco foi alocado antes do sistema de arquivos ficar cheio).
Scripts executados pelo cron também têm stdout e stderr em um arquivo temporário (então o cron tenta enviar um email com o conteúdo se não estiver vazio). Portanto, qualquer um dos comandos pode ter seu write(1, ...)
ou write(2, ...)
também falhar (com erro ENOSPC), o que poderia fazer com que eles se comportassem mal ou saíssem mais cedo se considerassem um erro fatal.