stdoutとstderrをファイル、syslog、および端末に送信する


8

私が起動している一部のクラウドマシンでは、特定のファイル、syslog、およびターミナル/コンソールにログを記録しようとしています。

マシンのsetup / cloud-initスクリプトの一番上に、次のものがあります。

#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package

これは、出力をファイルとsyslogに送信するのに最適ですが、出力をターミナルにパイプしません。

一般に、リモートコンソールからデバッグしている場合を除いて、ターミナル出力がないことは大きな問題ではありません。そうなると、bashスクリプトが実行されるときにコンソールが空白になるので、私は完全に盲目です。

bashリダイレクトなどを使用して、すべての出力(標準出力と標準エラーを含む)をファイル、syslog、および端末に同時にパイプする簡単な方法はありますか?

Ubuntu 16.04を実行しています。

回答:


8

ネストされたプロセス置換とteeそこに別のものを追加します:

exec &> >(tee >(tee "/tmp/box-setup.log" | logger -t box-setup))

teeメインプロセス置換内の最初のものがSTDOUT / STDERRをターミナルとネストされたプロセス置換に送信します。tee内部はファイルに内容を保存/tmp/box-setup.logし、パイプは出力をloggerのSTDINにも送信するために使用されます。


複数のT呼び出しについて混乱しています。n個のストリームに分岐しますが、これは同等ではありませんか?exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
ThorSummoner

3

bashスクリプトが実行されている間はコンソールが空白であるため、私は完全に盲目です。

その問題を別の方法で解決したい場合があります。バックグラウンドでbashスクリプトを実行less /tmp/box-setup.logし、実行してFキーを押して、監視しているファイル(のようにtail -f)に行が追加されたら画面を更新し続けます。

スクリプトをバックグラウンドで実行することが問題である場合は、tmuxまたはscreenを使用して、1つのSSH接続に複数のセッションを多重化します。less別のシェルで同じコマンドを使用します。


元の問題:

tee複数の宛先にコピーできます。/dev/tty特殊ファイルを使用して、それらの1つを端末にします。私はいつもそれが現在のプロセスの制御ttyを指していると思います。または、おそらく、のstderrはまだシェルのstderrに接続されている/dev/stderrので、より良いでしょうtee。(これにより、&> / dev / nullを使用してスクリプトを停止できます)。

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

ところで、これはと同等ですが、より効率的です(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)

teestderrではなく、いくつかのファイル記述子の複製を使用して、元のスクリプトのstdout を提供することが可能です。


1

/dev/stderr(選択)をへの出力として追加するだけteeです。

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

標準出力と標準エラーはマージされます。それらの順序を保持したい場合、それらを別々に保つ方法はありません。これは通常望ましいことです。いずれにしても、両方が同じ場所(例:端末)に行くかどうかは関係ありません。


teeのstdoutはロガーへのパイプであり、ターミナルではありません。それはだstderrその時点でに基づいて、まだ端末でありexec &> >(tee /dev/stderr > /dev/null)、対話型シェルで期待通りに働いて。 必要に応じてリダイレクトを使用してスクリプトを簡単にシャットダウンできるためstderr、私のアイデアよりも優れたアイデアのよう/dev/ttyです。
Peter Cordes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.