Я хочу захватить ВСЕ данные журналов, как с сообщениями об ошибках, из вывода моего скрипта, так и перенаправить их все в файл журнала.
У меня есть скрипт, как показано ниже:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Я хочу видеть все действия в файле /home/scripts/cron/logs
Но я вижу только то, что ставлю после команды echo.
Как проверить в логах, была ли команда SSH успешной?
Мне нужно собрать все данные журналов. Мне нужно это, чтобы отслеживать результат каждой команды в моем скрипте, чтобы лучше анализировать, что происходит, когда скрипт не работает.
Ответы:
Я обычно помещаю нечто похожее на следующее в начале каждого скрипта (особенно, если он будет работать как демон):
Объяснение:
exec 3>&1 4>&2
Сохраняет файловые дескрипторы, чтобы их можно было восстановить до того состояния, в котором они находились до перенаправления, или использовать себя для вывода того, чем они были до следующего перенаправления.
trap 'exec 2>&4 1>&3' 0 1 2 3
Восстановите файловые дескрипторы для определенных сигналов. Обычно не требуется, поскольку они должны быть восстановлены при выходе из суб-оболочки.
exec 1>log.out 2>&1
Перенаправить
stdout
в файл,log.out
затем перенаправитьstderr
вstdout
. Обратите внимание, что порядок важен, когда вы хотите, чтобы они шли к одному и тому же файлу.stdout
должен быть перенаправлен доstderr
перенаправления наstdout
.С этого момента, чтобы увидеть вывод на консоль (возможно), вы можете просто перенаправить на
&3
. Например,будет идти туда, куда
stdout
было направлено, предположительно в консоль, до выполнения строки 3 выше.источник
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. Псевдосигспец RETURN восстанавливает дескрипторы файлов каждый раз, когда выполняется функция оболочки или сценарий, выполняемый с помощью. или встроенные функции источника заканчивают выполняться. Для этого (и по другим причинам) в моих сценариях я добавляю в качестве последних двух строк:return
&exit 0
- Просто мои 2 цента, слава вам @nicerobot!trap
сигналов выглядит немного странно. Обычно вы также хотите включить15
.чтобы получить вывод ssh в ваш лог-файл, вы должны перенаправить
stderr
наstdout
. Вы можете сделать это, добавив2>&1
после своего сценария bash.это должно выглядеть так:
когда это не отображает сообщения в правильном порядке, попробуйте добавить еще одну подоболочку:
источник
( ... ) |& tee output.log
Когда я читаю ваш вопрос, вы не хотите регистрировать вывод, но всю последовательность команд, в этом случае другие ответы вам не помогут.
Вызвать сценарии оболочки с -x для вывода всего:
sh -x foo.sh
Войдите в файл, который вы хотите с:
sh -x foo.sh >> /home/scripts/cron/logs
источник
В bash вы можете поместить,
set -x
и он будет распечатывать каждую команду, которую он выполняет (и переменные bash) после этого. Вы можете отключить его с помощьюset +x
.Если вы хотите быть параноиком, вы можете вставить
set -o errexit
свой сценарий. Это означает, что сценарий завершится ошибкой и остановится, если одна команда вернула ненулевой код завершения, который является стандартным способом Unix, чтобы сообщить, что что-то пошло не так.Если вы хотите получить более хорошие журналы, вы должны смотреть на
ts
вmoreutils
пакете Debian / Ubuntu. Это будет префикс каждой строки с отметкой времени и распечатает ее. Таким образом, вы можете видеть, когда что-то происходит.источник
После от того , что говорили другие, набор ручной является хорошим ресурсом. Я кладу:
В верхней части сценариев я хочу продолжать работу или,
set -ex
если это произойдет, в случае ошибки.источник
ssh -vv
?