Как рассчитать количество файлов, которые можно передать в качестве аргументов какой-либо команде для пакетной обработки?

В Linux вы можете использовать:

ss -ltu

или

netstat -ltu

Список портовlприемаTCP и UDP.

Добавьте параметр -n(для ssили netstat), если вы хотите отключить преобразование номера порта и IP-адреса в имя службы и хоста.

Добавить параметр -pдля просмотра процессов (, если они есть, некоторые порты могут быть связаны ядром, например, для NFS ), которые прослушивают (если у вас нет привилегий суперпользователя, это будет предоставляйте эту информацию только для процессов, запущенных от вашего имени ).

Это будет список портов, на которых приложение прослушивает (UDP, к которому привязан сокет ). Обратите внимание, что некоторые могут прослушивать только заданный адрес только (IPv4 и/или IPv6 ), что будет отображаться в выводе ss/netstat(0.0.0.0означает прослушивание любого IPv4-адреса, [::]на любом IPv6-адресе ). Даже в этом случае это не означает, что данный другой хост в сети может связываться с системой через этот порт и этот адрес, поскольку любой брандмауэр, включая брандмауэр хоста, может блокировать или маскировать/перенаправлять входящие соединения на этот порт на основе более или менее сложные правила (, такие как разрешать соединения только с того или иного хоста, того или иного исходного порта, в то или иное время и только до того или иного количества минут и т. д. ).

Конфигурацию брандмауэра хоста можно посмотреть в выводе iptables-save.

Также обратите внимание, что если процесс или процессы прослушивают TCP-сокет, но не принимают там соединения, как только число ожидающих входящих соединений становится больше максимального невыполненного, соединения больше не будут принят, а с удаленного хоста будет показано, что порт заблокирован. Наблюдайте за столбцом Recv-Qв выводе ss/ netstat, чтобы определить те ситуации (, когда входящие соединения не принимаются, и заполнить очередь ).

6
20.09.2020, 13:33
3 ответа

Если это действительно важно,вы можете написать свою собственную batch-moveпрограмму на C, которая займет, например. список файлов в качестве стандартного ввода и выполняет перемещение с использованием соответствующих системных вызовов Unix.

Если нет, то «узнайте пределы и работайте над этим» точно то, чтоxargs(1)(делает версия GNU для Linux, здесь ). Я очень сомневаюсь, что вы станете намного быстрее.

3
18.03.2021, 23:04

Позвольте xargs сделать вычисления за вас.

printf '%s\0' files/* | xargs -0 mv -t new_files_dir
28
18.03.2021, 23:04

Ваш вопрос, кажется, предполагает, что существует фактическое «ограничение количества аргументов», хотя на самом деле это комбинация двух ограничений:

  1. сумма длин строк аргументов командной строки и переменных среды, включая их завершающие байты NUL.

  2. максимальная длина строки одной команды -строковый аргумент.

Например, вы можете вызвать команду с 200000 однобуквенных -аргументов, с 100000 двухбуквенных -аргументов, но не с одним аргументом размером более 128 КБ.

Предполагая xargsот GNU coreutils, xargs --show-limits </dev/nullпокажет, каковы эти ограничения в вашей системе.

В любой системе xargsне будет не использовать максимальные ограничения вашей системы при построении командных строк, а выберет что-то разумное, (нет никакого смысла нагружать систему таким образом ).

8
18.03.2021, 23:04

Теги

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