Сортировка: сбой записи | сломанная труба

AIX очень хорош в откат обновлений. Что ж - мы на сайте Unix / Linux, и вы никогда не указали, что хотите Linux :)

Каждое отдельное обновление AIX сохраняет все измененные файлы в отдельном подкаталоге внутри файловой системы / var. Обновление можно отменить с помощью простой собственной команды, и для функции revert не требуется, чтобы сеть была включена, ему не нужны какие-либо носители / пакеты, он не переустанавливайте что-либо, и это не зависит от какой-либо технологии создания моментальных снимков - в результате файлы снова появляются в том виде, в котором они были до обновления.

В качестве бонуса есть одна простая встроенная команда mksysb для создания загрузочной автономной резервной копии системы. Файл, который можно просто загрузить в полностью неисправной системе, которая не загружается из-за неисправности / повреждения.

И это все проверенные технологии с десятилетиями истории :)

4
01.04.2017, 00:02
2 ответа

Когда 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.

11
27.01.2020, 20:53

В качестве общего решения вы можете использовать эту функцию 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'

Это должно работать, даже если левая часть конвейера запускает дочерние процессы; все они будут прерваны.

0
22.05.2020, 12:22

Теги

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