После tar приводят выходы сценария к сбою, не обрабатывая ошибку

Aptitude перечисляет их в разделе "Устаревшие и локально созданные пакеты". Соответствующий шаблон поиска - ?obsolete или ~o.

aptitude search '?obsolete'
2
29.08.2018, 18:18
2 ответа

Ваш сценарий работает должным образом. Вывод dfявно попал в $LOG_FILE, а exit 1вызывает завершение сценария.

Мы не знаем, что делает ваша команда logging, но ПОЧТИ, она не предназначена для записи в $LOG_FILE. Если бы это было так, было бы немного глупо писать там Check the log file :${LOG _FILE} .

Редактировать

Теперь, когда вы опубликовали функцию logging, я вижу, что она использует здесь -строку(<<<).

В bash, здесь -строки и здесь -документы реализованы с использованием временных файлов (в $TMPDIRили /tmp, если $TMPDIRне определено ). Если это была заполненная файловая система, это объясняет, почему loggingничего не выводит.

$ 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

Вместо:

local now="$(date)"
cat <<< "${now} $@" | tee -a "${logfile}"

Просто используйте:

printf '%(%FT%T%z)T %s\n' -1 "$*"
printf '%(%FT%T%z)T %s\n' -1 "$*" >> "$logfile"

Или:

local msg
printf -v msg '%(%FT%T%z)T %s' -1 "$*"
printf '%s\n' "$msg"
printf '%s\n' "$msg" >> "$logfile"

(предполагает, что $IFSне установлено или начинается с пробела)

Это сохраняет временный файл, но также позволяет избежать разветвления любого процесса или выполнения какой-либо внешней команды (, которая также может дать сбой при некоторых патологических условиях)(и дает вам более удобный формат даты, не стесняйтесь адаптировать ).

В более общем смысле, система с полной файловой системой /tmp и /var — это ущербная система, вы можете ожидать, что многие вещи не будут работать должным образом.

Здесь вам повезло, что у вас вообще есть бревна. Дисковое пространство для файлов выделяется блоками (, обычно 4 КБ на ext4 ),вероятно, поэтому вы получили некоторый вывод в `$LOG _FILE (, так как последний блок был выделен до того, как файловая система заполнилась ).

Скрипты, запускаемые cron, также имеют свои stdout и stderr во временном файле (, затем cron пытается отправить электронное письмо с их содержимым, если они не пусты ). Таким образом, любая из команд может иметь свой write(1,...)или write(2,...)сбой, а также (с ошибкой ENOSPC ), что может привести к неправильному поведению или преждевременному завершению, если они сочтут это фатальной ошибкой.

3
27.01.2020, 21:58

Существует высокая вероятность того, что проблема в том, что

PACKING_EXITCODE=${PIPESTATUS[0]}

не является допустимым кодом оболочки, а чем-то bashспецифичным.

Cron вызывает команды с /bin/sh, отличным от bash.

Вы можете позволить своему скрипту начинаться с

#!/bin/bash

и сделайте скрипт исполняемым с помощью chmod +x scriptname, чтобы убедиться, что специальный код bashвыполняется bash, а не оболочкой по умолчанию.

1
27.01.2020, 21:58

Теги

Похожие вопросы