Передача вывода print/printf awk в команду оболочки заставляет этот оператор выполняться после всех других несвязанных операторов print/printf

Вы можете установить значения nice для каждого пользователя -или группы -, используя pam_limitsи файл /etc/security/limits.conf.

напр.

username    hard    priority    15

Это влияет только на службы PAM, которые настроены на использование модуля pam_limits. В зависимости от вашего дистрибутива это, вероятно, уже включено для таких служб, как login, cron, atd, sshdи других. Или вам может потребоваться включить его, добавив строку, подобную следующей, например,/etc/pam.d/login:

session    required   pam_limits.so

Подробнее см. man pam_limitsи комментарии в /etc/security/limits.conf. Если у вас установлен пакет документов PAM, дополнительная документация может находиться по адресу /usr/share/doc/libpam-doc/html/sag-pam_limits.html

.
5
04.11.2020, 14:54
1 ответ

Перенаправления и каналы в awk аналогичны перенаправлениям и каналам в sh, но есть одно важное отличие. В sh foo >barдержит barоткрытым только на время действия команды foo, а foo | barожидает завершения как foo, так и bar. В awk перенаправление или канал остаются открытыми до тех пор, пока они не будут закрыты явным образом, а перенаправление или подключение к одному и тому же имени файла или команде несколько раз повторно использует открытое перенаправление/канал.

Например, в sh это выводит a, b, c, a, b, потому что каждая команда сортировки получает только две строки ввода:

{ echo b; echo a; } | sort
echo c
{ echo b; echo a; } | sort

Но в awk это печатает c, a, a, b, b(, предполагая, что вывод awk представляет собой строку -, буферизованную, иначе cможет быть отложено ), потому что есть единственная команда sort, и она ничего не напечатает, пока не получит все свои входные данные, что происходит только тогда, когда входная сторона канала закрывается.

{ print "b"; print "a"; } | "sort";
print "c";
{ print "b"; print "a"; } | "sort";

Чтобы завершить конвейерную команду, вызовите функцию closeявно. Awk неявно закрывает все открытые каналы и перенаправления при выходе. Это печатает a, b, c, a, b:

.
{ print "b"; print "a"; } | "sort"; close("sort");
print "c";
{ print "b"; print "a"; } | "sort"; close("sort");

Аналогично, этот фрагмент awk создает двухстрочный -файл, поскольку fooоткрывается один раз первой строкой и остается открытым при запуске второй строки:

print "hello" >"foo";
print "world" >"foo";

Принимая во внимание, что этот фрагмент sh создает файл с одной -строкой, поскольку вторая строка открывает файл, созданный первой строкой, и усекает его перед записьюworld:

echo hello >foo
echo world >foo

Основная причина, по которой awk спроектирован таким образом, заключается в том, что существует неявный цикл обработки каждой строки. В ш,если вы хотите обрабатывать строки в цикле, вы обычно пишете перенаправление вокруг цикла:

while read line; do
  if condition "$line"; then
    process line
  fi
done >output

Но в awk не было бы способа применить перенаправление к неявному циклу, поэтому вы пишете

condition($0) { process $0 >"output" }

Способ awk также более мощный, потому что вы можете открывать и закрывать каналы по желанию, даже в середине цикла или других блоков. В sh это возможно для перенаправлений со встроенной командой exec, но не для каналов :канал должен применяться к (возможно составной команде )в целом.

3
18.03.2021, 22:52

Теги

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