AIX очень хорош в откат обновлений. Что ж - мы на сайте Unix / Linux, и вы никогда не указали, что хотите Linux :)
Каждое отдельное обновление AIX сохраняет все измененные файлы в отдельном подкаталоге внутри файловой системы / var. Обновление можно отменить с помощью простой собственной команды, и для функции revert не требуется, чтобы сеть была включена, ему не нужны какие-либо носители / пакеты, он не переустанавливайте что-либо, и это не зависит от какой-либо технологии создания моментальных снимков - в результате файлы снова появляются в том виде, в котором они были до обновления.
В качестве бонуса есть одна простая встроенная команда mksysb
для создания загрузочной автономной резервной копии системы. Файл, который можно просто загрузить в полностью неисправной системе, которая не загружается из-за неисправности / повреждения.
И это все проверенные технологии с десятилетиями истории :)
Когда head
завершает обработку первой строки, он выходит, закрывая другой конец канала. sort
может по-прежнему пытаться записать больше, а запись в закрытый канал или сокет возвращает ошибку EPIPE. Но он также вызывает сигнал SIGPIPE, убивая процесс, если только сигнал не проигнорирован или не обработан. Когда сигнал игнорируется, sort
видит ошибку, жалуется и завершает работу. Но если сигнал не проигнорировать, он просто умирает, не оставляя сообщения об ошибке.
Игнорирование сигналов наследуется дочерними процессами, поэтому мы можем управлять им из оболочки:
$ trap - PIPE # set default action for signal
$ sort bigfile | head -1 > /dev/null # no error message
$ trap "" PIPE # ignore the signal
$ sort bigfile | head -1 > /dev/null
sort: write failed: standard output: Broken pipe
sort: write error
Я понятия не имею, почему cron игнорирует сигнал, если только это не связано с systemd, который очевидно делает SIGPIPE по умолчанию игнорируется:
не очень полезно для обычных демонов, и поскольку мы пытаемся предоставить хорошая, полезная среда выполнения для демонов, мы отключаем это. Из конечно, оболочки и тому подобное должны снова включить это.
В моей системе /lib/systemd/system/cron.service
явно отменяет значение по умолчанию для cron, устанавливая IgnoreSIGPIPE=false
.
В качестве общего решения вы можете использовать эту функцию Bash для запуска канала без ошибки сломанного канала и без сокрытия других возможных сообщений об ошибках:
entire_pipe() {
( set -m; (
trap 'exit 0' INT
echo $BASHPID
$1
) & wait $! ) |
(
trap 'trap - EXIT; kill -s INT -- -$pid 2>/dev/null || :' EXIT
read -r pid
$2
)
}
Чтобы сделать это более переносимым, вы можете заменить $BASHPID
на $(exec sh -c 'echo "$PPID"')
.
Чтобы использовать функцию в случае возникновения этого вопроса, замените
sort --random-sort /root/ips.csv | head -n 1
по
entire_pipe 'sort --random-sort /root/ips.csv' 'head -n 1'
Это должно работать, даже если левая часть конвейера запускает дочерние процессы; все они будут прерваны.