Невозможно использовать всю память

Предположим, что структура каталогов подобна следующей:

A
|-- B
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- C
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- D
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
`-- E
    |-- file1.out
    |-- file2.out
    `-- file3.out

Проблема с вашим кодом заключается в том, что ваш grepбудет выдавать результат, похожий на

./B/file1.out:2:some data which includes the word index123
./B/file2.out:2:some data which includes the word index123
./B/file3.out:2:some data which includes the word index123
./C/file1.out:2:some data which includes the word index123
./C/file2.out:2:some data which includes the word index123
./C/file3.out:2:some data which includes the word index123
./D/file1.out:2:some data which includes the word index123
./D/file2.out:2:some data which includes the word index123
./D/file3.out:2:some data which includes the word index123
./E/file1.out:2:some data which includes the word index123
./E/file2.out:2:some data which includes the word index123
./E/file3.out:2:some data which includes the word index123

Это вывод

grep --include=\*.out -rnw. -e "index123"

с Aв качестве текущего каталога.

Затем вы попытаетесь выполнить basenameдля этих отдельных строк, что не удастся, поскольку basenameпринимает не более двух аргументов, (имя пути и суффикс, который необходимо удалить из этого имени пути ). GNU basenameбудет жаловаться на «дополнительный операнд», тогда как BSD basenameбудет жаловаться на неправильное использование.


grepпокажет вам только имена файлов (, т. е. не полную строку, совпадающую с ), если вы используете ее с флагом -l.

Это означает, что ваш скрипт может быть заменен одной командой

grep -w -l "index123" */*.out

Это даст результат в форме

B/file1.out
B/file2.out
B/file3.out
C/file1.out
C/file2.out
C/file3.out
D/file1.out
D/file2.out
D/file3.out
E/file1.out
E/file2.out
E/file3.out

Я добавил -w, как вы использовали в командной строке grep.-n(для нумерации строк, которые вы также используете ), нельзя использовать вместе с -l.

Судя по вашему коду, это то, что вам нужно.

Если вам нужны только имена папок, сделайте

$ grep -w -l "index123" */*.out | sed 's#/[^/]*##' | sort -u
B
C
D
E

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

0
16.04.2020, 16:55
1 ответ

Вы используете строгий учет перерасхода , поэтому процессам не разрешено отображать больше доступной памяти. Строка Committed_ASпоказывает, что в настоящее время выделено 9543584 КБ, а строка CommitLimitпоказывает, что ограничение составляет 16760020 КБ, остается 7216436 КБ, которые могут быть выделены; это 59,6% вашей доступной памяти, поэтому, принимая во внимание некоторые накладные расходы для stress-ng, неудивительно, что вы не можете выделить более 55% доступной памяти для vm worker.

Если вы хотите разрешить stress-ngвыделять больше доступной памяти, вам нужно разрешить чрезмерную выделение:

sudo sysctl vm.overcommit_memory=0

или увеличьте сумму свопа, чтобы увеличить лимит фиксации.

1
19.03.2021, 02:28

Теги

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