cmd1 | cmd2Сделать левую сторону трубы закончить, когда правая сторона заканчивается
Как я могу заставить команду отправки трубы прекратить работу, когда принимающая команда заканчивается?
cmd1 обрабатывает данные из файла, а его выходные данные передаются по каналу в cmd2.
cmd2 получает вывод cmd1 и выполняет некоторую обработку, которая выводится в файл. Он имеет возможность прекратить работу после того, как записано определенное количество байтов.
Проблема, с которой я сталкиваюсь, заключается в том, что cmd1 продолжает выполняться до тех пор, пока не обработает все данные в обрабатываемом файле, хотя cmd2 завершен.
Это может занять много времени и замедлить мой сценарий оболочки.
Конкретная объяснение того, что я делаю:
A «Суперагент» сетевой пробник устройство захвата трафика и хранить его в файлах на кольцевом буфере 6 часов. Это необработанные файлы захвата в том или ином формате. Собственная команда может быть использована для создания файлов pcap на основе временного диапазона. Это cmd1 сверху и называется «buildpcap»
6 часов трафика могут генерировать очень большой (200GB +) файл.
Я хочу ограничить общий pcap до 10 ГБ и разделить его на части размером 1 ГБ.
Я не могу ограничить вывод размера файла и не разбивать на несколько файлов с помощью buildpcap, но я могу выводить на stdout, а не файл, и передавать его команде, которая может; в этом случае дамппак wirehark, который является cmd2 сверху.
Я хочу, чтобы dumpcap генерировал 10 x 1G файлов, а затем завершался. Он делает это, но buildpcap продолжает работать на signficant количество времени
Фактические команды я использую следующие:
buildpcap --feed 3 --start-datetimed $ начать --end-DATETIME $ end --stdout | dumpcap -i - -w ./tmp.pcap -a файлы: 10 -b размер файла: 10000000
Надеюсь, это имеет смысл.
Не могли бы вы в ближайшее время объяснить, что делают ваши cmd1 и 2? если вы попробуете 'yes | awk 'NR == 100 {exit}'', когда cmd2 (awk) заканчивается, команда 'yes' также заканчивается. – Kent