1

これは比較的単純なはずですが、これまで遭遇したことがなく、頭を悩ませています。

簡単なスクリプト:

echo `tail /var/log/qmailcheck.log` >> $EMAIL
cat $EMAIL | mail -s "Daily server report from server.ca" email@here.com

(私はtailちょうど物事が正しく見えるようにしたかっただけで、cmdの周りの目盛りのセットが欠けていることを知っています)

問題は、私がテールアウトしているログファイルにはすべてのエントリに新しい行がありますが、送信される電子メールはすべてを1行にまとめているため、次の代わりに:

Mon Feb 4 11:05:01 MST 2013-- Check Completed Successfully
Mon Feb 4 11:10:01 MST 2013-- Check Completed Successfully
Mon Feb 4 11:15:01 MST 2013-- Check Completed Successfully
Mon Feb 4 11:20:01 MST 2013-- Check Completed Successfully
Mon Feb 4 11:25:01 MST 2013-- Check Completed Successfully

私はこれを得る:
Mon Feb 4 11:05:01 MST 2013-- Check Completed Successfully Mon Feb 4 11:10:01 MST 2013-- Check Completed Successfully Mon Feb 4 11:15:01 MST 2013-- Check Completed Successfully Mon Feb 4 11:20:01 MST 2013-- Check Completed Successfully Mon Feb 4 11:25:01 MST 2013-- Check Completed Successfully

スクリプトは他の多くのコマンドからもエコーし、それらも1行に実行されるようです。以前にこれを行ったことがありますが、問題はありませんでした。何が欠けていますか?

スクリプト全体は次のとおりです。

ERROR=/tmp/errorlog
RECIP=$(cat /root/bin/emailrec)

echo Hi, this email to inform you of any potential issues with the server.bla qmail mail server > /tmp/demail

grep pls /var/log/qmailcheck.log > /tmp/errorlog

if [ ! -s $ERROR ] ; then
    echo There are no errors in the qmailcheck log file >> /tmp/demail
    echo Here are the last 10 lines of the current qmailcheck log file: >> /tmp/demail
    tail /var/log/qmailcheck.log >> /tmp/demail
else
    echo The log file for the qmail check script contains the following errors: >> /tmp/demail
    cat $ERROR >> /tmp/demail
    echo You should have also received an email which will better explain the error >> /tmp/demail
    echo Check the time of the error above to determine when the email was sent >> /tmp/demail
fi
MAIL=$(/var/qmail/bin/qmail-qstat | grep "queue:" | awk '{ print $4 }')
echo There are $MAIL messages in the mail queue >> /tmp/demail

echo File system usage is currently at `df -h |grep vzfs | awk '{ print $5}'` >> /tmp/demail


cat /tmp/demail | mail -s "Daily server report from server.bla" $RECIP
4

2 に答える 2

2

これは、どちらも必要ないときにエコーとコマンド置換を使用することで得られるものです。

唯一の違いは

echo `command args...`

command args

改行が折りたたまれていることです(そしてコードが読みにくくなっています)。使うだけ

tail /var/log/qmailcheck.log | mail -s ....

(中間ファイルを使用する場合は、echoバッククォートなしでも使用できます)。

コマンド置換には別のスタイルがあることに注意してください:$(command...)ネストされた引用符の問題を取り除き、一般的に読みやすくなります。コマンド置換が必要な場合はいつでも、バッククォートの代わりにこのスタイルを使用できます。

于 2013-02-04T18:52:55.617 に答える
1

変化する:

echo `tail /var/log/qmailcheck.log` >> $EMAIL

に:

echo "`tail /var/log/qmailcheck.log`" >> $EMAIL

コマンド置換を二重引用符で囲むと、改行からスペースへの変換が行われる文字列の分割が防止されます。

ただし、Anton Kovalenko のソリューションを使用することをお勧めします。ここで使用する必要はまったくありませんecho。コマンドをファイルに直接リダイレクトするだけです。

于 2013-02-04T19:26:37.067 に答える