Ведение журнала / поиск ошибки в.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
Ошибки, я бы посоветовал вам перенаправить вывод ошибок в файл, чтобы вы могли просмотреть его на досуге.