Как отслеживать производительность модуля ядра «iptables»?

Во-первых, ваш пример false | echo okне имеет смысла, поскольку falseничего не выводит на свой стандартный вывод, а echoне читает со своего стандартного ввода. «Решение» этого false && echo ok.

cmd1 && cmd2

Это запустит cmd1и не запустит cmd2, пока cmd1не завершит успешное выполнение.

В конвейере, таком как

cmd1 | cmd2

две команды всегда запускаются одновременно (это то, что вы заметили в своем «Неудачное решение 1» ). Их синхронизирует чтение cmd2из вывода cmd1. Конвейер — это способ передачи вывода одной программы во ввод другой, параллельно работающей программы.

Чтобы имитировать, что cmd1выводит что-то, что читает cmd2, но чтобы избавиться от параллелизма, вам нужно сохранить вывод из cmd1во временный файл, который cmd2читает:

cmd1 >outfile && cmd2 

Временный файл может обрабатываться следующим образом:

trap 'rm -f "$tmpfile"' EXIT
tmpfile=$(mktemp)

cmd1 >"$tmpfile" && cmd2 <"$tmpfile"

Это устанавливает ловушку, которая срабатывает при выходе из оболочки. Ловушка удалит временный файл.

Если у вас есть $TMPDIRв файловой системе памяти, вы не понесете никаких штрафов за ввод-вывод за запись на диск.

Если вас беспокоит размер файла, то вы будете вынуждены хранить его на диске во что бы то ни стало (канал также не сможет удерживать содержимое, это то, что вы заметили в своем " Неудачное решение 3" ).


Глядя на решение xhienne для Bash:

result=$(cmd1) && cmd2 <<< "$result"
unset result

Это работает, если результатом является текст, который не заканчивается пустыми строками, но не работает, если он содержит нулевые байты (они будут отброшеныbash).

Чтобы смягчить это, мы могли бы base64 -закодировать результат:

set -o pipefail # ksh/zsh/bash
result=$( cmd1 | base64 ) && base64 -d <<<"$result" | cmd2
unset result

Это ужасная идея с точки зрения использования памяти и процессора.особенно если результат большой (, кодировка base64 $resultбудет на треть больше, чем двоичная ). Гораздо лучше записать двоичный результат на диск и прочитать его оттуда.

Также обратите внимание, что bashреализует <<<с использованием временного файла в любом случае.

1
17.12.2019, 13:05
0 ответов

Теги

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