2012-04-04 11 views
5

我々はシェルスクリプトで、出力のリダイレクト先を調べる方法はありますか?

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

今、私は出力がでなくなったファイルかを把握することができますsomeScript.sh中でどのによって方法がある(クーロンで)自然を次のスクリプトを持っていますか?

スクリプトは要約を含むメールを送信します。同時に、私は詳細を見つけることができるので、出力ファイルを電子メールで見つけることができます。

私は標準出力などを検出するのではなく、どのように出力ファイル名を取得するために構造if [ -t 1 ]の承知していますか? これは一般的なものであるため、一部の人がcronで出力ファイルを変更でき、スクリプトを変更する必要がないことに注意してください。

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

$$は、(スクリプト内の)スクリプトのPIDである:私は考えることができ

+1

移動するには、プロセスの電子メールの一部'someScript.sh'を呼び出すラッパースクリプトは、正しく実行されたことを確認し、適切に作成された電子メール(成功、警告またはエラー)を送信します。 ELFはlogFile varを設定し、それをエクスポートし、上のtmp/...を$ logFileに置き換えます。スクリプト内の$ {logFile}に依存します。がんばろう。 – shellter

答えて

9

最も簡単な事があることです。ほとんどのUNIXシステムでは、/ proc/[pid]はプロセス[pid]の情報を含む疑似ディレクトリです。

の/ proc/[PID]/fdがプロセスのオープンファイル記述子のためのシンボリックリンクのリストを含むディレクトリです。 FD/0/1をFD、入力されているなど、スクリプトの出力であるあなたが出力をリダイレクトしない場合は

READLINKは、あなたのターゲットファイルまたは端末を提供します。もちろん

あなたはそれを表示したい場合、あなたはどこか別の標準出力に含まよりも、それを表示するために持っているか、それがリダイレクトされます!デバッグするには、stdエラー(2)を試してください。

様々な召しは

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

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

# ./script.sh | more 
/proc/12132/fd/pipe:[916212] 
+0

恐ろしい!私は答えを受け入れています。 @huelbois。私はあなたがこれ以上の票を得ることを望みます。 –

+0

私はコメントしています。なぜなら、Linuxは**タグではありませんでした。私は私のMacに '/ proc'を持っていません。 – anubhava

+0

Thanx @ring bearer!苦しいプロジェクトでわずか20日間、Macで仕事をする機会はあまりありませんでした。それにもかかわらず、/ proc疑似ファイルシステムからは非常に興味深いものが得られます。 – huelbois

4

よりもむしろハックを見つけよう(script.shはちょうど& 2 READLINK -f/procの/ $$/FD/1>を呼び出します)私のボックスにそれらの結果を与える(とあまりにもプラットフォームに依存する)、ここでは若干異なるアプローチをとる方がよい。このようなあなたのcronジョブを設定し

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

すなわちなしと>または2>&1(標準出力/標準エラー出力がリダイレクトストリーム)とちょうど希望logfile名前と引数を渡します。今someScript.shは、このようなあなたのログファイルにストリームをリダイレクト内

LOGFILE=$1 
exec &>${LOGFILE} 

を最後にすることができますし、メッセージにクライアントその:

"output details could be found in ${LOGFILE}" 
関連する問題