2009-10-01 28 views
0

你好,我有一個發送電子郵件的shell腳本。 這裏是它如何工作的:文件本身清空

  • 它從一個URL讀取HTML,並把 它在文件中
  • 遍歷所有的電子郵件和 它從HTML文件中讀取循環

問題是:

  • 的HTML文件 幾百個電子郵件,沒有明顯的之後變空原因。 (我把du/thehtml.html放在電子郵件日誌中。)

任何人知道爲什麼?謝謝。

來源:

/usr/local/bin/lynx --source http://www.site.com/email.php?message=1 > /root/lynx.html 
read var < /root/lynx.html 
if [ -z "$var" ]; then 
    echo "" > /dev/null 
else 

     /usr/local/bin/lynx --source http://www.site.com/email.php?list=1 > /root/html_mail.html 
     number=0 
     OLDIFS = "$IFS" 
     export IFS="," 
     read mails < /root/html_mail.html 
     for mail in $mails; do 
       echo "To: $mail " > /root/finished_message.html 
       cat /root/lynx.html >> /root/finished_message.html 
       /usr/sbin/sendmail "$mail" < /root/finished_message.html 
       echo ".*. $number. " - ". $mail .*." >> /bin/scripts/email.log 
       du /root/lynx.html >> /bin/scripts/email.log 
       number=$((number+1)) 
     done; 
     IFS = "$OLDIFS" 
     lynx --source http://www.site.com/email.php?done_with=1 
    fi 
+0

也許張貼源代碼會更好地幫助您接收有用的答案? – Himanshu

+0

只是爲了安全起見:您的原始網址中沒有任何'&'? – phoku

+0

nope,只是改變了域名 –

回答

0

這可能是其中2個進程試圖寫入文件,從而會破壞它的競爭條件。但是,從描述中很難說清楚。你如何試圖將這個問題簡化爲能夠再現問題的最簡單的代碼?

+0

它只寫入一次。那麼它只是讀取。 –

0

嘗試使用mktemp作爲文件名。

我敢肯定你會在代碼中的某處覆蓋文件 - 通過並行運行代碼。

嘗試:

SOURCE_HTML=`mktemp lynx-XXXX.html` 
lynx --source URL > $SOURCE_HTML 
# the rest ... 

而且 - 這是某種形式的垃圾郵件產生的?

+0

不,只是定期訂閱電子郵件更新 –

+0

很確定它不會覆蓋它。 –

0

嘗試把這一權利的else後:

chmod -w /root/lynx.html 

,看看誰抱怨。

0

誰啓動腳本,cron?對我來說,看起來你在第一個完成發送郵件之前啓動了另一個腳本實例。一個快速的方法來驗證這是前

/usr/local/bin/lynx --source http://www.site.com/email.php?list=1 > /root/html_mail.html 

echo "END mailer script" >>/bin/scripts/email.log 

echo "BEGIN mailer script" >>/bin/scripts/email.log 

添加的東西完成後,在IFS =

下一次,之前的日誌顯示歸零html_mail.html你很可能會看到在日誌文件中像

END 
BEGIN 
.*. 
.*. 
BEGIN 
du zero size 

。我希望你沒有看到,因爲如果你這樣做,你可能在html_mail.html沒有被清零的所有重疊情況下發送了錯誤或亂碼的消息。

作爲一個便箋,我強烈建議phoku建議爲腳本創建的所有臨時文件使用唯一的臨時名稱。

+0

是的,cronjob啓動它。會嘗試。 –