SSHPASS и найти ошибку в Bash Скрипт резервного копирования

Это можно сделать двумя способами:

  • запустить vim в сеансе screen и подключитесь к нему с разных терминалов
  • запустите vim в режиме клиент / сервер

Дополнительная литература:

0
02.08.2018, 11:03
1 ответ

;в конце команды, выполняемой от findдо -exec, необходимо заключать в кавычки, чтобы защитить ее от оболочки. В противном случае оболочка увидит его как конец команды find.

Изменить

find /var/production-backup/ -mtime +7 -exec rm -rf {} ;

-

find /var/production-backup/ -mtime +7 -exec rm -rf {} ';'

или на

find /var/production-backup/ -mtime +7 -exec rm -rf {} \;

или просто

find /var/production-backup/ -mtime +7 -delete

, если ваш findподдерживает это.

Также обратите внимание, что ваша команда findне делает различий между каталогами, файлами или другими вещами в /var/production-backup. Если, например, сам каталог /var/production-backupне изменялся более семи дней (, потому что в нем не было создано/удалено файлов или каталогов ), то вся эта файловая иерархия будет удалена.

Если вы собираетесь удалять только обычные файлы, используйте

find /var/production-backup/ -type f -mtime +7 -delete

Связанные:


Другие примечания к вашему коду:

Если да

TAR=$(which tar)

и более позднее использование

$TAR...

для создания tarархива,тогда вы можете также использовать tarнапрямую. Нет смысла устанавливать TARна путь к двоичному файлу tarс which, так как это приведет к поиску PATHточно так же, как использование tarнапрямую. То же самое касается и других команд, которые вы храните в переменных.

Проверка [ `$MKDIR -p "$PRODBACKDIR"` ]должна быть проверкой непосредственно состояния возврата mkdir. Утилита mkdirне выдает вывод, который можно протестировать. Вам также не нужно проверять наличие каталога перед использованиемmkdir -p:

if mkdir -p "$PRODBACKDIR"; then
    echo 'Directory Created for site'
fi

Также обратите внимание, что вы используете {$PRODBACKDIR}, что добавит {и }к пути к каталогу. Поскольку это делается в бесполезном тесте каталога, никакого вреда не было (тест всегда терпел неудачу ). Вам также не нужно echo -eздесь.

Вам не нужно {}вокруг имен переменных в расширениях переменных. Единственное место, где вам нужно написать ${variable}, — это когда расширение является частью строки, где следующий за ним символ является допустимым символом в имени переменной, как в "${variable}x". Однако вам нужно заключать в двойные кавычки все раскрытия переменных.

Параметр --progressдля rsyncзаписывается с двумя дефисами, а не с одним. Кроме того, -e ssh, насколько мне известно, используется по умолчанию для rsyncс давних пор.

Линия

FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');

может быть записано с использованием стандартной замены параметра как

FILENAME=${DOC##*/}

Вам очень редко приходится тестировать против $?. Например, вместо

tar...
if [ $? -eq 0 ]; then...

сделать

if tar...; then...

Также рассмотрите возможность использования printfдля вывода переменных данных.

Вы определяете TODAY_DATEкак строку, содержащую сегодняшнюю дату, но используете ее только дважды. Однако есть как минимум три других вызова dateс немного другим форматом... (также, %Y-%m-%dможно заменить на %F, см.man strftime).

Вам не нужно ;в конце команд, за которыми сразу не следуют другие команды в той же строке. Новая строка работает как терминатор команды.

И т. д.,...

Я бы также посоветовал изучить существующее программное обеспечение для резервного копирования. Я мог бы порекомендовать, например, borgbackupи restic.

Связанные:

3
28.01.2020, 02:23

Теги

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