Как передать ввод по конвейеру второй команде в псевдониме?

Это может быть прозрачная проблема с огромными страницами, когда поток ядра khugepaged буквально извлекает оперативную память для ее дефрагментации или создает огромные страницы из 4-килобайтных.

Ядро могло принять решение о включении огромных страниц, учитывая довольно большой объем системной оперативной памяти.

Проверьте содержимое этих двух настраиваемых параметров ядра:

/sys/kernel/mm/transparent_hugepage/enabled
/sys/kernel/mm/transparent_hugepage/defrag

Если их содержимое always, вы можете изменить neverи посмотреть, исчезнут ли всплески/зависания процессора.

0
25.11.2019, 07:54
3 ответа

Я предлагаю вам попробовать подход xargs, т.е.:

alias xyz='command1; command2 | xargs pqr'

Это эквивалентно запуску pqrс command2в качестве входного аргумента

0
28.01.2020, 02:38

Использование псевдонима обычно не является хорошей практикой в ​​не -интерактивных сценариях оболочки(BashFAQ/080). То, как у вас есть псевдоним, определенный в вашем OP, только первые команды считываются со стандартного ввода, потому что ;прерывает ваш стандартный ввод от выхода за пределы вашей первой команды.

Одним из возможных способов является группировка команд с использованием {..}, чтобы любые направления -относились ко всему набору команд в группе. Вы все еще можете сохранить свое aliasопределение и выполнить

alias xyz='{ command1; command2; }'

В этом случае ваш comamnd1без необходимости получает копию стандартного ввода. Вы можете закрыть его, выполнив

alias xyz='{ command1 < /dev/null ; command2 - ; }'

Или используйте функции для определения ваших команд внутри.

xyz() {
    command1; command2
}

Если ваша оболочка bashили zshподдерживает подстановку процессов, вы можете просто определить command2для получения содержимого стандартного ввода в качестве позиционных аргументов. В отношении -определите свою функцию как

xyz() {
    command1
    command2 "$@"
}

, а затем вызовите команду(pqr)как

xyz < <(pqr)

Простая демонстрация вышеизложенного,

zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food)                     #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood
1
28.01.2020, 02:38

Чтобы передать что-то на стандартный ввод command2в списке команд

command1; command2

вы должны убедиться, что command1не читается со стандартного ввода. Это можно сделать, перенаправив стандартный ввод с /dev/nullна command1:

.
command1 </dev/null; command2

Это оставляет вас с псевдонимом

alias xyz='command1 </dev/null; command2`

который вы не не сможете вызвать с помощью

pqr | xyz -f -

, так как это было бы эквивалентно

pqr | command1 </dev/null; command2 -f -

то же, что и

pqr | command1 </dev/null
command2 -f -

Вместо этого определите xyzкак функцию оболочки:

xyz () {
    command1 </dev/null
    command2 "$@"
}

Здесь command2получит как стандартный ввод функции, так и любые аргументы командной строки, переданные функции.

Теперь вы сможете использовать это как в конвейере pqr | xyz -f -.

Если (и только если )аргументы -f -, которые вы передаете в command2, говорят «читать со стандартного ввода» (с -, обозначающим стандартный ввод ), тогда вы может вместо -передать подстановку процесса на xyz, если ваша оболочка поддерживает это:

xyz -f <(pqr)

С приведенной выше функцией это будет то же самое, что и

command1 </dev/null
command2 -f <(pqr)
0
28.01.2020, 02:38

Теги

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