Вставка строки в файле, только если эта строка еще не является частью файла

Если Вы вручную добавляете новый диск к своему дефектному массиву RAID 1 для восстановления его, то можно использовать -W и --write-behind опции достигнуть некоторой настройки производительности:

- W, - пишут главным образом

последующие устройства, перечисленные в - сборка, - создают, или - добавляют com-и будет отмечен как запись главным образом, Это допустимо для RAID1 только и означает, что md драйвер постарается не читать из этих устройств если вообще возможный. Это может быть полезно при зеркальном отражении по медленному каналу.

- запишите - позади =

Укажите, что запись - позади режима должна быть включена (допустимая только для RAID1). Если аргумент будет указан, то он определит максимальный номер выдающихся позволенных записей. Значение по умолчанию 256. Поглощенный записью битовый массив требуется для использования записи - позади режима, и запись - позади только предпринята на дисках, отмеченных как запись главным образом.

2
21.01.2019, 17:09
4 ответа

Это проблема:

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 ничего не нашла, и нет произошла ошибка.

7
27.01.2020, 21:49

Вероятно, это сработает:

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.

0
27.01.2020, 21:49

Это могло быть потому, что ваш grep ничего не возвращает. Поскольку это не цитируется, вы получите это сообщение об ошибке (ожидается унарный оператор). Попробуйте: -

if [ "$(grep vm.swappiness /etc/sysctl.conf)" != "vm.swappiness=5" ]; then
4
27.01.2020, 21:49

Просто для воодушевляющих целей, возможно, нужно немного доработать:

#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

Также может быть хорошо обернуть это в функцию, так что вы также можете вызвать ее со следующим параметром.

3
27.01.2020, 21:49

Теги

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