LimitNProc=
является rlimit (, их также называют ulimit ). "См. setrlimit (2 )для получения подробной информации об ограничении ресурсов. Концепция... Обратите внимание, что большинство ограничений ресурсов процесса, настроенных с помощью этих опции для каждого процесса -, и процессы могут разветвляться, чтобы получить новый набор ресурсов, которые учитываются независимо от исходный процесс и, таким образом, может выйти за установленные ограничения». Это задокументировано в man systemd.exec
. RLIMIT_NPROC
является одним из исключений из этой цитаты; оно ограничивает количество процессов «для реального идентификатора пользователя» (UID ). ].
TasksMax=
задокументировано в более конкретном man systemd.resource-control
,как один из вариантов, который «опирается на Linux Control Groups (cgroups )концепция ядра для организации процессов». Все такие ограничения применяются к cgroup, созданной для службы systemd. cgroups нельзя избежать, просто разветвив новый процесс.
TasksMax=
имеет гораздо больше смысла для меня. Я не знаю причин, по которым вы могли бы использовать LimitNProc=
.
Чтобы не читать файлы целиком (, как это делает wc
), когда после первой строки вы знаете, что в файле как минимум 2 строки, я бы сделал (в системе GNU.):
LC_ALL=C gawk -v ORS='\0' '
FNR == 2 {nextfile}
ENDFILE {if (FNR < 2) print FILENAME}' /path/File_* |
xargs -r0 rm -f
Это также более эффективно, так как сводит к минимуму количество выполняемых команд.
Более надежен, так как работает с произвольными именами файлов.
В качестве функционального отличия от решений на основеwc
-:он не будет удалять файлы, содержащие одну строку с разделителями, за которой следует одна строка без разделителей -.
Этот возвращает ненулевой -статус выхода только в том случае, если файл не может быть удален (и был там с самого начала ).
Ваша проблема в том, что статус выхода этой линии конвейера является статусом выхода правой -самой команды в ней (, если вы не используете опцию pipefail
).
Самая правая -команда здесь — цикл while
. Статус выхода из цикла соответствует последнему выполнению команды в теле цикла. В вашем случае это будет команда [ "$FN" != total ]
, запускаемая в последней строке ввода, которая будет не -нулем, если только не будет только одного /path/File_*
файла (, и в этом случае wc
не будет вывести общее количество ).
Если вы изменили его на:
[ "$CNT" -gt 1 ] || [ "$FN" = total ] || rm -f -- "$FN"
Вы получите статус выхода, отличный от -нулевого, только если последний файл заголовка не может быть удален.