2016-02-25 49 views
0

我是一個系統管理員,我經常有一種情況,我有一個腳本或命令,生成大量的輸出,我只想通過電子郵件發送到我如果命令失敗。編寫一個運行命令的腳本非常容易,收集輸出並在命令失敗時通過電子郵件發送它,但是我想我應該能夠編寫一個命令:bash腳本接受登錄標準輸入和電子郵件日誌如果輸入過程失敗

1)接受stdin上的日誌信息 2)等待輸入過程退出並查看它的退出狀態是否爲 3a)如果輸入過程乾淨地退出,將日誌輸入附加到正常日誌文件中(如果輸入過程失敗),將日誌輸入附加到正常日誌併發送給我一封電子郵件。

它看起來像這樣的命令行:

something_important | mailonfail.sh [email protected] /var/log/normal_log 

這將使得它可以很方便的的crontab使用。

我無法弄清楚如何讓腳本等待寫入過程並評估過程如何退出。

只是要exatra清楚,這裏是我如何與一個包裝做到這一點:

#! /bin/bash 

something_important > output 
ERR=$! 

if [ "$ERR" -ne "0" ] ; then 
    cat something_important | mail -s "something_important failed" [email protected] 
fi 
cat something_important >> /var/log/normal_log 

再次聲明,這不是我想要的,我想要寫一個腳本,並管道命令進去。

這有道理嗎?我會怎麼做?我錯過了什麼嗎?

謝謝大家! -Dylan

回答

1

是的,它確實有道理,而且你很接近。

下面是一些建議:

#!/bin/sh 

TEMPFILE=$(mktemp) 
trap "rm -f $TEMPFILE" EXIT 

if [ ! something_important > $TEMPFILE ]; then 
    mail -s 'something goes oops' -a $TEMPFILE [email protected] 
fi 
cat $TEMPFILE >> /var/log/normal.log 
  • 我不會用bash化這樣/ bin/sh的是罰款
  • 創建一個臨時文件,以避免使用mktemp(1)
  • 使用trap刪除衝突文件當腳本退出時,通常與否
  • 如果命令失敗
  • 然後安裝文件,該文件會或不會優先於將它嵌入

    • ,如果它是一個很大的文件,你甚至可以gzip壓縮它,但附件的方法將改變:

      # using mailx 
      gzip -c9 $TEMPFILE | uuencode fail.log.gz | mailx -s subject ... 
      
      # using mutt 
      gzip $TEMPFILE 
      mutt -a $TEMPFILE.gz -s ... 
      gzip -d $TEMPFILE.gz 
      

+0

你是一個可愛的人,這是一個可愛的答案,但是這是我已經知道如何做的事。無論如何,我給你+1。 – pileofrogs

+0

對不起,我似乎沒有完全理解你的問題......是關於如何等待給定時間的一個命令(如果它太慢就殺死它)?我不確定「腳本和管道命令」嗎? – bufh

+0

我希望能夠執行「./some_command | myscript.sh」並讓myscript.sh知道some_command退出是否正常。 – pileofrogs

相關問題