Aptitude перечисляет их в разделе "Устаревшие и локально созданные пакеты". Соответствующий шаблон поиска - ?obsolete
или ~o
.
aptitude search '?obsolete'
Ваш сценарий работает должным образом. Вывод 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 ), что может привести к неправильному поведению или преждевременному завершению, если они сочтут это фатальной ошибкой.
Существует высокая вероятность того, что проблема в том, что
PACKING_EXITCODE=${PIPESTATUS[0]}
не является допустимым кодом оболочки, а чем-то bash
специфичным.
Cron вызывает команды с /bin/sh
, отличным от bash
.
Вы можете позволить своему скрипту начинаться с
#!/bin/bash
и сделайте скрипт исполняемым с помощью chmod +x scriptname
, чтобы убедиться, что специальный код bash
выполняется bash
, а не оболочкой по умолчанию.