BlackHole開發日記-設置Mac下開機啓動,qmail DNS攔截

今天,太陽照常升起,逃過了一劫,那就開始新的生命吧。服務器

爲了把BlackHole推廣出去,想要作一個MacOS下的包。調研了mac開機啓動的東西,將啓動程序寫成了一個plist文件,放在/Library/LaunchDaemons下面,腳本是這樣的:app

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
      <key>Label</key>
      <string>blackhole.init</string>
      <key>ProgramArguments</key>
      <array>
        <string>/usr/local/blackhole/blackhole-start.sh</string>
      </array>
        <key>KeepAlive</key>
        <false/>
      <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/blackhole.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/blackhole.out</string>
        <key>UserName</key>
        <string>root</string>
  </dict>
</plist>

事實證實UserName=root那段必須加上,要否則不會用root權限啓動,而後就會失敗!異步

重啓後一切正常,開始使用BlackHole做爲DNS服務器,考察穩定性。測試

早上來到公司就出事了,主進程啓動了,wifesays沒啓動,致使telnet無響應。悲劇!線程

爲何wifesays總是啓動不起來?debug

後來知道,由於Spring初始化時是阻塞進行的,包括afterPropertySet方法,若是裏面調用了耗時較長的程序,則會阻塞直到服務結束纔會繼續初始化,而這個過程的順序是未知的。ehcache初始化的時間挺久(好多秒,不知道爲何),而後就致使wifesays的進程一直等不到Spring初始化結束,這時調用之,就拋出了空指針異常!後來將ehcache作了異步加載,並進行了錯誤判斷,問題解決!指針

下午使用qmail進行攔截測試的時候出了點問題,後來debug發現qmail居然打了一條ANY類型的請求!原來還有這種類型,長見識了。code

找到幾個公用的DNS服務器,之後能夠增長多服務器切換的功能。xml

多服務器的可用性是個問題,恰好最近也在研究服務器的可用性維護。最終實現以下:使用failedTimes和wakeup機制。failedTimes由外部調用指定,當次數過多時,標誌爲不可用;內部線程按期循環,嘗試檢查不可用的服務器,一旦可用,則從新標誌爲可用。進程

相關文章
相關標籤/搜索