Если я запустил следующее:
chef-client --force-formatter --logfile STDOUT 2>&1
И затем control-c в середине (или возникнет какая-либо ошибка). Я вижу это приятное сообщение об ошибке:
[2014-09-12T00:00:30-04:00] FATAL: SIGINT received, stopping
================================================================================
Recipe Compile Error in /var/cache/chef/cookbooks/users/recipes/fen.rb
================================================================================
SystemExit
----------
exit
Cookbook Trace:
---------------
/var/cache/chef/cookbooks/users/recipes/default.rb:11:in ``'
/var/cache/chef/cookbooks/users/recipes/default.rb:11:in `from_file'
/var/cache/chef/cookbooks/users/recipes/fen.rb:15:in `from_file'
Relevant File Content:
----------------------
/var/cache/chef/cookbooks/users/recipes/default.rb:
etc...
[2014-09-12T00:00:30-04:00] ERROR: Running exception handlers
[2014-09-12T00:00:30-04:00] ERROR: Exception handlers complete
[2014-09-12T00:00:30-04:00] FATAL: Stacktrace dumped to /var/cache/chef/chef-stacktrace.out
Chef Client failed. 0 resources updated
Но если я сделаю следующее:
chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log
И затем control-c, я вижу все сообщения журнала, которые видел раньше, за исключением того приятного фатального сообщения, рассказывающего мне, что происходит. Файл, который я тоже отправляю, также не показывает фатальное сообщение.
Таким образом, очевидно, что chef-client определяет, подключен ли он к фактическому файловому дескриптору, и подавляет вывод, если это так. Кто-нибудь знает, как остановить это?
Кажется, Chef выводит ошибку в STDERR вместо STDOUT, несмотря на указание STDOUT в качестве файла журнала. Следующая команда должна работать:
chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log
Я придумал аккуратный хак
script -c chef-client /tmp/chef.log
Делает именно то, что хочу.
Кажется, лучший вариант, чем два других ответа:
chef-client -o recipe_name --format doc --no-color | tee output.log
В doc
format печатает ход выполнения chef-client, используя полные строки, отображающие сводку обновлений по мере их появления.