5

次の性質のスクリプトがあります(cron)

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

ここでsomeScript.sh、出力がどのファイルに入ったかを把握する方法はありますか?

スクリプトは要約を含む電子メールを送信します。同時に、詳細はそのように出力ファイルにある可能性があることを言及したいと思います-電子メールで。

if [ -t 1 ]stdoutなどを検出するための構造を知っていますが、出力ファイル名を取得する方法は?誰かがcronで出力ファイルを変更でき、スクリプトを変更する必要がないように、これを汎用的にしたいことに注意してください。

4

2 に答える 2

9

私が考えることができる最も簡単なことはそれです:

readlink -f /proc/$$/fd/1

$$は、スクリプトのPIDです(スクリプト内)。ほとんどのUNIXシステムでは、/ proc/[pid]はプロセス[pid]の情報を含む疑似ディレクトリです。

/ proc / [pid] / fdは、プロセスの開いているファイル記述子のシンボリックリンクのリストを含むディレクトリです。fd / 0は入力、fd/1はスクリプトの出力などです。

次に、readlinkは、出力をリダイレクトしない場合は、ターゲットファイルまたはttyを提供します。

もちろん、表示したい場合は、標準出力以外の場所に表示する必要があります。そうしないと、リダイレクトされます。デバッグするには、標準エラー(2)を試してください。

さまざまな呼び出しが私のボックスにそれらの結果を与えます(script.shはreadlink -f / proc / $$ / fd / 1>&2を呼び出すだけです)

# ./script.sh
/dev/pts/0

# ./script.sh > /var/tmp/foo
/var/tmp/foo

# ./script.sh | more
/proc/12132/fd/pipe:[916212]
于 2012-04-04T15:31:51.037 に答える
4

ハックを見つけようとする(そしてプラットフォームに依存しすぎる)よりも、ここで少し異なるアプローチを取る方が良いでしょう。

cronジョブを次のように設定します。

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log

つまり、and>またはor 2>&1(stdout / stderrストリームリダイレクト)を使用せずに、目的のlogfile名前の引数を渡すだけです。

someScript.sh内で、ストリームを次のようにログファイルにリダイレクトします。

LOGFILE=$1
exec &>${LOGFILE}

そして最後に、クライアントに次のようにメッセージを送ることができます。

"output details could be found in ${LOGFILE}"
于 2012-04-04T15:49:12.900 に答える