Linux:stdoutとstderrをロガーにリダイレクトする方法は?


22

起動時に実行する必要のあるプログラムがあり、stdoutおよびstderrに出力があり、ロガーコマンドを使用してシステムログにリダイレクトします。私のスタートアップスクリプトには、次のものがあります。

/ home / dirname / application_name -v | logger 2>&1&

これはstdoutをsyslogにリダイレクトしますが、stderrがコンソールに来るので、コマンドを改良する必要があります。


回答:


30

にパイプする前に、STDERRとSTDOUTの出力を結合する必要がありますlogger。代わりにこれを試してください:

/home/dirname/application_name -v 2>&1 | logger &

$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+  Done                    echo "hi" 2>&1 | logger

$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi

実際のBashシェルで慎重に使用する場合は、ここでも短縮表記を使用できます(Dashと混同しないでください)。

$ echo "hi" |& logger &

注:これはと同等<cmd1> 2>&1 | <cmd2>です。繰り返しますが、実際のBashシェルをインタラクティブに使用する場合にのみ上記を使用して、それにアプローチするのに適した方法です。

ABSGからの抜粋

#|&は、2>&1 |の略語としてBash 4に追加されました。

参照資料


2
slm、攻撃は意味しませんでしたが、後者の形式はramp延するバシズム乱用です。そのような不必要な速記が引き起こす可能性のある問題の量は、それらの使用から得られる利益がほとんどないほど価値がありません。たとえば、自分のマシンだけでも、上記をスクリプトに入れて、dash起動時にスクリプトを実行しようとすると失敗するだけで、起動プロセスがおかしくなります...常に対話型のシェルのみのコンテキストであるか、少なくとも、そういうことは私の意見です。
mikeserv 14

@mikeserv-違反はありません8-)。これらはABSGガイドに含まれているため、これらを含めます。OPがBashを使用していることを示し2>&1たので(おそらく間違って)想定していましたが、例がスタートアップを扱っていることを考えると、警告はかなり賢明です。後者のヒントは、対話型のみのBashシェルを対象としているという警告とともに、より目立つようにします。
slm

@mikeserv-いいえ、それは健全なアドバイスです。私は通常、DashやUbuntuさえも使用していないので、これらの問題に少し気づいていませんが、まだ非常に現実的であり、Ubuntu / Debian / Dashがより一般的なシナリオである可能性が高いため、指摘するのは良いことです。
slm

正直なところ、debianも使用していませんが、多くの人が使用していることをますます認識しています。dashしかし、私は使用しています-それは本当に速いです。
mikeserv 14

1
まあ、それは必要ではないかもしれません-あなたはそれがインタラクティブなシェルで違いを生むのに十分速くタイプすることができません-私はzshを使用します。しかし、スクリプトの場合、ダッシュは私が試した他のどのダッシュよりも高速です。
mikeserv 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.