Linux не может применить "найти" в канале

Check CPU usage, if it is higher than 80% (as example) Do something.

Современные ЦП имеют несколько ядер, и часто каждое ядро ​​поддерживает несколько потоков. Более того, ядра часто имеют переменную тактовую частоту. Тогда не так просто определить, как вычислить загрузку ЦП. Не говоря уже о том, что один виртуальный ЦП может быть либо на 100 % бездействующим, либо на 100 % занятым в любой момент времени. Не существует такой вещи, как мгновенная загрузка процессора на 80%.

Что можно сделать, так это получить среднюю нагрузку для каждого виртуального ЦП за определенный период времени (mpstat предоставляет это )или среднее значение для всех объединенных виртуальных ЦП (vmstat ).

Даже если враждебный потребитель ЦП является однопоточным -однопоточным, даже если он полностью привязан к ЦП, в последнем случае он может явно не отображаться, поскольку другие виртуальные ЦП могут простаивать.

Если многопоточность и привязка к ЦП, это будет обнаружено обеими командами, но вы должны убедиться, что это не законное приложение или демон, загружающий вашу машину.

Еще одна более полезная метрика выводится из конкуренции за ЦП, т. е. измеряет количество потоков, использующих и конкурирующих за ресурсы виртуального ЦП. Это то, что средняя нагрузка призвана показать. К сожалению, в Linux средняя загрузка рассматривает непрерывное состояние потока как загрузку ЦП, в то время как на самом деле,ЦП простаивает и свободен для выполнения других задач, поэтому вам следует обратить внимание на этот фактор и определить потенциальные случаи, когда средняя нагрузка высока, а фактическая конкуренция низка.

Наконец, могут возникнуть ситуации, когда очередь выполнения очень велика, но в течение очень ограниченного периода времени. Если расчет средней нагрузки, который использует выборку для получения значения очереди выполнения, выберет число в этот самый пиковый момент, значение средней нагрузки будет сильно смещено в течение нескольких минут или десятков минут.

0
27.01.2020, 01:00
3 ответа

Ваша проблема в том, что вы пытаетесь отфильтровать (удалить )сообщения об ошибках из стандартного вывода find. Сообщения об ошибках (и общие диагностические сообщения, а также интерактивные подсказки )отображаются в стандартном потоке ошибок, который нельзя передать по конвейеру. Поэтому вы не можете избавиться от сообщений об ошибках с помощьюgrep(без слияния стандартного потока ошибок со стандартным потоком вывода ).

Использование GNU find(, реализующего нестандартный -readableтест):

find. -type d ! -readable -prune -o -name xyz -print

Это будет искать все, что называется xyzв текущем каталоге или ниже, и распечатывать найденные пути. Всякий раз, когда findвстречается с каталогом, к которому у текущего пользователя нет доступа для чтения, этот каталог удаляется из дерева поиска (, дерево поиска обрезается с помощью-prune).

Это избавляет от ошибок «Отказано в доступе», возникающих при попытке доступа к каталогам, к которым у вас нет доступа. Он делает это, просто не попадая в ситуации, в которых эти ошибки могут быть сгенерированы.

Избегая grep, это также позволит избежать случайной фильтрации файлов, найденных в каталогах, буквально называемых Permission. Это также позволяет вам видеть любые другие ошибки, которые могут быть сгенерированы при поискеxyz(какими бы ни были эти ошибки ), или записывать в -строковые сценарии, выполняемые через find... -exec..., которые может захотеть использовать поток ошибок или использовать find... -ok...для запроса подтверждения пользователя перед выполнением какого-либо действия.

4
28.01.2020, 02:13

Что происходит

Вы используете только трубопровод выход(не ошибка)

и как это исправить?

Добавляя &к вертикальной черте.


Pipelines [...] The standard output of command is connected via a pipe to the standard input of command2...If |& is used, command's standard error, in addition to its standard output...

(man bash)

Чтобы перенаправить ошибку поиска «канал» на выходной канал, вы можете сделать:

find -name '???' 2>&1 |grep -v Permission

или с помощью «ярлыка»|&:

find -name '???' |& grep -v Permission

Но это только техническая сторона вашего вопроса. Элегантно, потому что использует два стандарта (output=1 и error=2 ), но в остальном немного сомнительно (см. другие ответы ).


-1
28.01.2020, 02:13

«Отказано в доступе» — это предупреждение, а не те данные, которые можно ожидать от find. Чтобы сообщения об ошибках были отделены от запрошенных пользовательских данных, findпечатает имена файлов в свой стандартный канал вывода 1, а предупреждение — в стандартный канал ошибок 2. Такое поведение очень распространено среди многих линейных инструментов команды unix -. Оболочка обычно отображает оба канала. Вы можете избежать этого, явно перенаправив -поток ошибок куда-то еще, например. пустота, представленная/dev/null:

find. -name xyz 2>/dev/null
6
28.01.2020, 02:13

Теги

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