Комментарии 2
Мы сталкивались с таким поведением, когда надо было обеспечить семплирование tsv.gz файлов. То есть надо было вычитать из файла N строк, что в принципе решается при помощи zcat | head -N | gzip конвейера. И понятно, что нет никакого смысла команде head дочитывать вход до конца.
Но и команде zcat тоже надо понимать когда ей надо закончить работу. Тот же SIGPIPE можно и проигнорировать разными способами. Тут наиболее правильным решением, наверное, окажется не попытки организации нестандартных конвейеров, а всё ж создание элементов конвейера более подходящих для задачи. Например, сделать команду аналогичную zcat, но умеющую семплировать данные.
PS. Параллелизация в bash возможна как минимум 3 разными способами и, на мой взгляд, bash совсем не подходит для столь сложных задач, потому что даже проконтролировать все коды выхода не всегда возможно…
Но и команде zcat тоже надо понимать когда ей надо закончить работу. Тот же SIGPIPE можно и проигнорировать разными способами. Тут наиболее правильным решением, наверное, окажется не попытки организации нестандартных конвейеров, а всё ж создание элементов конвейера более подходящих для задачи. Например, сделать команду аналогичную zcat, но умеющую семплировать данные.
PS. Параллелизация в bash возможна как минимум 3 разными способами и, на мой взгляд, bash совсем не подходит для столь сложных задач, потому что даже проконтролировать все коды выхода не всегда возможно…
0
Добавлю, почему нельзя просто так игнорировать ошибку выполнения первой команды. Дело в том, что мы хотим заигнорировать один конкретный вид ошибки — ошибку записи в закрытый пайп. Но ведь причин, почему команда отвалилась может быть множество: segmentation fault, ошибка чтения диска, ошибка в читаемых данных, отсутствие файла для чтения, неверное окружение на сервере, отсутствие какого-нибудь модуля. Ведь мы не хотим игнорировать вообще всё это?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Заметки о Unix: два сценария работы с конвейерами