Ведение журнала / поиск ошибки в.sh скрипте

У меня есть базовый сценарий.sh для создания ночных резервных копий. Весь код:

#!/bin/bash

DATE=`date +%Y%m%d`

tar czfP /var/www/backup/$DATE.tar.gz `find /var/www/web -type d | grep -E '/var/www/web/web[0-9]+/web' | grep -v 'web1'`

Это делает меня $DATE.tar.gz файл всех сетей исключает "web1". Работает правильно, до сегодняшнего дня.

Когда я выполняю этот скрипт вручную в консоли (не используя cron), я вижу какие-либо предупреждения ("No such file or directory", как правило, когда имя / имя файла имеет пробел в имени). Ничего, я ничего не могу поделать, клиенты сами создают файлы. Я думаю, что эти файлы не находятся в резервной копии.

Но сегодня запуск скрипта заканчивается в 1/3 с сообщением об ошибке Exiting with failure status due to previous errors, Я не знаю, где сценарий не работает, так что...

Есть ли способ, как записать "путь / имя файла" последней ошибки файла (вызывая "Exiting with failure status due to previous errors"в журнал? Если возможно, мы можем исключить ошибки "Нет такого файла или каталога", они будут появляться ежедневно без возможности исправления имен файлов.

Спасибо

PS:
Я прочитал это сообщение об ошибке может быть вызвано неправильными разрешениями пользователя. Если так, я могу проверить разрешения, но мне нужно знать, где происходит сбой скрипта. До сих пор он действительно работал правильно, примерно 3 года назад, все файлы созданы CMS (тот же пользователь www), ничего не загружается вручную.

1 ответ

Выход из find токенизируется оболочкой, что означает, что любое имя файла с пробелом в нем будет разбито на части (несколько видимых имен файлов, ни одно из которых, вероятно, не существует). По сути, не используйте обратные пометки (или, в более общем случае, подстановки команд), где вывод представляет собой список имен файлов.

В зависимости от ваших точных требований, обходной путь может быть очень простым.

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web

будет архивировать web0 а также web2 через web9, Если это все, что вам нужно, вы уже сделали. Вы можете расширить до однозначных и двузначных цифр без значительной разборчивости:

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web /var/www/web/www[02-9][0-9]/web

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

В более общем плане вы можете изучить --exclude вариант GNU tar,

Даже более широко, если у вас есть GNU findвы можете заставить его производить вывод, где имена путей разделяются нулевыми байтами, а не символами новой строки. Это делает вывод однозначным (ноль - единственный символ, который никогда не может встречаться в имени файла) и устойчивым.

find /var/www/web/www[0-9]/web -type d -path web1/web -prune -o -print0 |
xargs -r0 tar czfP /var/www/backup/"$DATE".tar.gz

-print0 вариант и соответствующий xargs -0 опция является расширением GNU. Без них практически невозможно надежно обрабатывать произвольные имена файлов, поэтому я предлагаю вам установить версию GNU, если вы застряли на архитектуре, которая не предоставляет ее "из коробки".

Что касается захвата tar Ошибки, я бы посоветовал вам перенаправить вывод ошибок в файл, чтобы вы могли просмотреть его на досуге.

Другие вопросы по тегам