Если Вы вручную добавляете новый диск к своему дефектному массиву RAID 1 для восстановления его, то можно использовать -W
и --write-behind
опции достигнуть некоторой настройки производительности:
- W, - пишут главным образом
последующие устройства, перечисленные в - сборка, - создают, или - добавляют com-и будет отмечен как запись главным образом, Это допустимо для RAID1 только и означает, что md драйвер постарается не читать из этих устройств если вообще возможный. Это может быть полезно при зеркальном отражении по медленному каналу.
- запишите - позади =
Укажите, что запись - позади режима должна быть включена (допустимая только для RAID1). Если аргумент будет указан, то он определит максимальный номер выдающихся позволенных записей. Значение по умолчанию 256. Поглощенный записью битовый массив требуется для использования записи - позади режима, и запись - позади только предпринята на дисках, отмеченных как запись главным образом.
Это проблема:
if [ `grep vm.swappiness /etc/sysctl.conf` != "vm.swappiness=5" ]; then
Поскольку, если grep
ничего не находит, он ничего не выводит, и в левой части этого сообщения будет ничего, что является ошибкой. Также проблема, если он что-то найдет, поскольку вывод может содержать пробелы (например, если vm.swappiness
присутствует в файле несколько раз). Это необходимо заключить в кавычки, иначе при расширении он будет отображаться как серия отдельных строк.
Таким образом, вы должны использовать if ["$ (grep ...)"]
, чтобы вывод был заключен в кавычки. Если нет вывода, у вас есть ""
, что подходит для обеих сторон теста в bash.
Однако в этом случае я бы рекомендовал вместо этого использовать статус выхода команды grep. Из man grep
:
СОСТОЯНИЕ ВЫХОДА
Обычно статус выхода равен 0, если выбранные строки найдены, и 1 в противном случае. Но статус выхода равен 2, если произошла ошибка ...
Также можно использовать ключ -q
:
-q, --quiet, --silent
Quiet; ничего не выводите на стандартный вывод. Немедленно выйдите с нулевым статусом , если найдено какое-либо совпадение, даже если обнаружена ошибка.
Итак, имея в виду $?
- это статус выхода последнего завершенного процесса переднего плана:
grep -q grep vm.vfs_cache_pressure /etc/sysctl.conf
if [ $? -eq 1 ]; then
Это условие будет истинным, если grep
ничего не нашла, и нет произошла ошибка.
Вероятно, это сработает:
f=/etc/sysctl.conf
[ -w "$f" ] || exit 1
for line in 'vm.swappiness=5' 'vm.vfs_cache_pressure=50' ; do
grep -q "$line" <"$f" || printf %s\\n "$line"
done >>"$f"
Вероятно, вам также следует извлечь sudo
из этого сценария. Если нужно, запустите скрипт с sudo
как sudo ./script.sh
и сохраните его как отдельный модуль от других скриптов. Else do:
sudo sh -c '
f=/etc/sysctl.conf
[ -w "$f" ] || exit 1
for line in "vm.swappiness=5" "vm.vfs_cache_pressure=50" ; do
grep -q "$line" <"$f" || printf %s\\n "$line"
done >>"$f"
'
But I don't recommend it.
Это могло быть потому, что ваш grep
ничего не возвращает. Поскольку это не цитируется, вы получите это сообщение об ошибке (ожидается унарный оператор). Попробуйте: -
if [ "$(grep vm.swappiness /etc/sysctl.conf)" != "vm.swappiness=5" ]; then
Просто для воодушевляющих целей, возможно, нужно немного доработать:
#assuming there is only one line with vm.swappiness
#otherwise you can use the test command with "grep -c vm.swappiness" first
#tests if the correct line is in the file
if grep -q -E '^vm.swappiness=5$' /etc/sysctl.conf; then
echo "all good, do nothing";
else
echo "removing possible lines with vm.swappiness"
sudo sed -i '/^vm.swappiness=/d' /etc/sysctl.conf
echo "adding line with correct swappiness"
sudo bash -c "echo 'vm.swappiness=5' >> /etc/sysctl.conf"
fi
Также может быть хорошо обернуть это в функцию, так что вы также можете вызвать ее со следующим параметром.