Я думаю, вы ищете /proc/sys/vm/overcommit_memory
, для которого вам следует установить значение 2, чтобы обеспечить принудительную проверку выделения памяти (программы не смогут выделить больше памяти, чем реально доступно ). Вам, вероятно, также потребуется настроить /proc/sys/vm/overcommit_ratio
, по крайней мере, если какой-либо из ваших программ необходимо выделить более половины установленной памяти. Все это документировано на procfs
справочной странице .
Я бы порекомендовал пересмотреть ваше решение отключить все ваши свопы; см. Зачем Linux нужно пространство подкачки в виртуальной машине? для получения подробной информации.
Стоит отметить, что ядро не может выполнить подкачку, если подкачка отключена. Все, что он может сделать, это использовать сопоставленные файлы в качестве резервного хранилища, но это обычно не требует написания (, в частности, для исполняемых файлов и библиотек ). Если вы видите записи в состоянии стресса, это, вероятно, связано с тем, что ядро сбрасывает грязные страницы (в основном из своих буферов ), чтобы попытаться восстановить их.
Начнем с двух возможных решений, а затем объясним, почему возникла ошибка.
Решение 1::
Просто "временно" экспортируйте две переменные, чтобы они были доступны для вашей под-оболочки
#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>
export from="$1" && export to="$2" && find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/$from/$to}"' "{}" \; 2>&1 | grep -v "Permission denied"
exit 0
Итак, здесь мы экспортируем $1 в переменную from и $2 в переменную to. Таким образом оболочка sub -сможет их прочитать.
Решение 2::(проще, и его могут предпочесть те, кому не нравится временный экспорт)
#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>
find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/$1/$2}"' "{}" "$1" "$2" \; 2>&1 | grep -v "Permission denied"
exit 0
Это решение состоит в том, чтобы просто передать «$1» и «$2» помимо {} (текущего результата поиска ), чтобы оболочка подпрограммы -могла нормально обращаться к ним, как если бы это был сценарий на ее own (за исключением того, что с опцией -c, переданной в bash, первым аргументом будет $0 вместо $1; это, кажется, известно вам, так как вы уже использовали это)
Общие сведения о двух решениях::
Причина ошибки::
Причина ошибки, которую вы получили ("один и тот же файл" ), очень проста.
В вашем скрипте команда mv заменила данный файл "$0" другим файлом, полученным в результате замены строки ("${0/$1/$2}" ). Итак, в вашем случае $1 и $2 не были переданы команде оболочки sub -, так что это похоже на то, что вы сделали «${0/}», что ничего не сделает. В результате старое и новое имена файлов будут одинаковыми,отсюда и ошибка.
Параметры в вашем скрипте заключаются в одинарные кавычки 'mv "$0" "${0/$1/$2}"'
, что предотвращает их неправильную интерпретацию.
Следующее работает:
#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>
#
find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/'"$1/$2"'}' {} \; 2>&1 | grep -v "Permission denied" | grep -v "are the same file"
Обратите внимание на то, что $1
и $2
больше не в одинарных кавычках, а в двойных кавычках — способ, которым что-то цитируется, может иметь решающее значение.