??????? kelefa是某公司的一個程序員,傳說他是一流的程序員,開發了一個系統非常穩定,從來沒有出現過問題,當然這世界上沒有完美的人,也沒有完美的軟件,這個系統也有bug,而且他已經發現了,但是一直沒有找到很好的辦法解決,還好這個bug很少有機會能發作,關鍵是一發生這種情況時嚴重影響系統的運行,停止服務后再重新啟動是目前最好的方法。
??????? 為了保住“高手”的稱號,他又搞了一個監控該系統的小程序,能及時發現系統是否工作正常,如果發現異常情況立刻發送email給自己,email又跟自己的手機短信綁定,使他能迅速的發現情況并跑到電腦前:
//telnet進來后
[root@kelefa?root]$?su?-
[root@kelefa?root]$?password?
[root@kelefa?root]#?cd?/usr/local/resin-3.0.14/bin
[root@kelefa?bin]#?./httpd.sh??stop
[root@kelefa?bin]#?./httpd.sh??start一切又正常了,1分鐘內搞定,一流程序員再次得到驗證,可是email有時會發送失敗,sp的短信也不是絕對的正常,而且每個月還給n元大洋給sp,萬一收到告警短信旁邊沒有電腦也無能為力。
??????? 終于發現更好的方法:在監控程序里直接telnet到設備上進行操作,動手前當然要看看有什么開源的可以利用,它就是Jakarta的Commons Net,這個包支持ftp,telnet,pop3,smtp,nntp等協議。
??????? 首先實現一個telnet的基類,它有個connectAndDocommad()的方法,實現鏈接到指定的設備上,并啟動一個線程執行一個模板方法(某設計模式):

?? // 登陸
???log.debug( "login................" );
???if ( false == login() )
???{
????String msg = new Date().toString() + " telnet登陸不成功,ip:" + remoteip;
????log.warn( msg );
????SyslogUtil.send( msg );
????return;
???}
???log.debug( "doCommand................" );
???//?抽象方法
???doCommand();
???// 退出
???log.debug( "exit................" );
???exit();
??????? 其次類RestartTask繼承該抽象類,實現doCommand()抽象方法,往輸出流發送操作命令,實現重啟:
@Override protected void doCommand()
?{
??log.debug( "resin restart................" );
??try
??{
???? writeLine("su -");????
???? writeLine("password");?
???? writeLine("cd /usr/local/resin-3.0.14/bin");
???? writeLine("./httpd.sh? stop");
???? writeLine("./httpd.sh? start");
???? readResult();
??}
??catch ( IOException e )
??{
???log.warn( e.getMessage() );
??}
?}
以上為偽代碼,需要實現一些子方法, 如有雷同,純屬虛構!