今天,太阳照常升起,逃过了一劫,那就开始新的生命吧。服务器
为了把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由外部调用指定,当次数过多时,标志为不可用;内部线程按期循环,尝试检查不可用的服务器,一旦可用,则从新标志为可用。进程