Для некоторых облачных машин, которые я запускаю, я пытаюсь войти в определенный файл, системный журнал и терминал / консоль.
В верхней части сценариев настройки моего компьютера / cloud-init у меня есть следующее:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Это прекрасно работает при отправке вывода в файл и системный журнал, но не направляет вывод на терминал.
Вообще говоря, отсутствие вывода на терминал не является большой проблемой, за исключением случаев, когда я отлаживаю с удаленной консоли. Когда это происходит, я полностью ослеп, потому что консоль пуста, когда выполняется скрипт bash.
Существует ли простой способ с помощью bash
перенаправления или чего-либо еще, чтобы передать весь вывод (стандартный вывод вместе со стандартной ошибкой) в файл, системный журнал и терминал одновременно?
Я использую Ubuntu 16.04.
источник
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Возможно, вы захотите решить эту проблему другим способом: запустите ваш bash-скрипт в фоновом режиме, запустите
less /tmp/box-setup.log
и нажмите F, чтобы продолжать обновлять экран по мере добавления строк в файл, который он просматривает (напримерtail -f
).Если запуск сценария в фоновом режиме является проблемой, используйте
tmux
или,screen
чтобы объединить несколько сеансов в одно соединение ssh. Используйте ту жеless
команду в другой оболочке.Оригинальная проблема:
tee
можно копировать в несколько мест назначения. Сделайте один из них терминалом, используя/dev/tty
специальный файл. Я думаю, что это всегда относится к контролю tty текущего процесса. Или, может быть, лучше,/dev/stderr
потомуtee
что stderr все еще подключен к stderr оболочки. (Это позволяет отключить скрипт с помощью &> / dev / null).Кстати, это эквивалентно, но более эффективно, чем
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Можно было бы использовать некоторое клонирование дескриптора файла, чтобы получить
tee
стандартный вывод исходного сценария, а не stderr.источник
Просто добавьте
/dev/stderr
(ваш выбор) в качестве вывода наtee
.Стандартный вывод и стандартная ошибка будут объединены. Невозможно разделить их, если вы хотите сохранить их порядок, что обычно желательно. Неважно, если они оба собираются в одно и то же место (например, терминал) в любом случае.
источник
tee
Stdout - это канал к логгеру, а не к терминалу. Этоstderr
на тот момент все еще терминал, основанный наexec &> >(tee /dev/stderr > /dev/null)
работе, как и ожидалось, в интерактивной оболочке.stderr
кажется лучшей идеей, чем моя/dev/tty
идея, поскольку она позволяет легко закрыть скрипт перенаправлением, если хотите.