前不久剛接觸Greenplum的工作,由於每天都要進行很多重複操作,就抽空寫了個Greenplum運維繫統,其本質就是與Linux交互,執行一些常見的重複操作命令。因爲一些代碼是參考別的大佬文章,就直接貼文章地址。最終頁面像下面這樣:
其中涉及到兩個關鍵點,這裏簡單記錄一下,包括:
1) 遠程執行Linux命令(執行正常的腳本或命令、執行nohup命令)
2) Linux交互命令執行(切換用戶執行命令、scp、從一臺主機ssh到其它主機等)
1、遠程執行Linux命令之執行常用命令或腳本
要想實現Linux運維,遠程登錄Linux系統,並執行命令是萬里長征第一步。用的Java的ganymed-ssh2插件,可以參考下面的文章:Java 遠程執行 Linux 的命令、java遠程調用linux的命令或者腳本。想一次執行多個命令,直接搜這個插件的文章有很多。
2、遠程執行Linux命令之執行nohup命令
之所以單獨說明nohup的執行,是因爲中間遇到了執行nohup命令不生效的問題,百度了很多文章改環境變量啥的都不管用。後來參考這篇文章:Ganymed_SSH2執行執行nohup命令失敗,直接改代碼,新增了執行nohup命令的函數。
3、執行Linux交互命令之expect
開發後來遇到了兩個問題:
1) 系統中有些操作需要root用戶執行,這時需要su -切換,然後再輸入命令。
2) 因爲集羣內的Segment節點只有私網IP,只能通過Master節點ssh過去,而前面的方法只能登陸到Master節點,簡單執行命令後獲取返回結果,無法交互執行。比如:在Master節點ssh、scp之後要輸入密碼等等。
然後發現了一個神奇的工具-expect,可以事先寫好腳本,然後和linux交互執行。我這裏用它主要做了幾件事:Master節點ssh到Segment節點、Master節點和Segment節點拷貝內容、掛載NFS。
文章我也找不到參考的那個了,找了個比較全的:linux交互執行命令,expect,
注意:如果expect默認10s超時,如果執行久的命令,可以set timeout -1