linux指令碼:ssh 啟動多個遠端程式
如果直接
#!/bin/bash
ssh 192.168.49.1 '/home/geohpc/run_gdcnmsrv.sh'
ssh 192.168.49.2 '/home/geohpc/run_gdcnmsrv.sh'
ssh 192.168.49.3 '/home/geohpc/run_gdcnmsrv.sh'
這樣只會執行第一個命令。其他命令阻塞。而且斷開終端遠端程式會停止
解決方法就是忽略終端關閉的訊號,使用nohup命令,更強大的是screen命令在此不使用。
因此啟動節點的指令碼為(前提已經設定好ssh免密碼登陸):
將指令碼改為可執行chmod +x run.sh#!/bin/bash nohup ssh 192.168.49.1 '/home/geohpc/run_gdcnmsrv.sh' & nohup ssh 192.168.49.2 '/home/geohpc/run_gdcnmsrv.sh' & nohup ssh 192.168.49.3 '/home/geohpc/run_gdcnmsrv.sh' & nohup ssh 192.168.49.1 '/home/geohpc/run_gdmnmsrv.sh' & echo "launch mapscen success..."
遠端指令碼run_gdcnmsrv.sh
#!/bin/bash
cd ~/gdos/bin
./gdcnmsrv
ps:新增關閉功能後的指令碼:
#!/bin/bash CN="/home/geohpc/run_gdcnmsrv.sh" MN="/home/geohpc/run_gdmnmsrv.sh" KLCN="pkill -9 gdcnmsrv" KLMN="pkill -9 gdmnmsrv" if [ "$1" == "start" ]; then nohup ssh 192.168.49.1 ${CN} & nohup ssh 192.168.49.2 ${CN} & nohup ssh 192.168.49.3 ${CN} & nohup ssh 192.168.49.1 ${MN} & elif [ "$1" == "stop" ]; then nohup ssh 192.168.49.1 ${KLCN} & nohup ssh 192.168.49.2 ${KLCN} & nohup ssh 192.168.49.3 ${KLCN} & nohup ssh 192.168.49.1 ${KLMN} & fi echo "ok"
終端異常退出後,後臺程序不關閉的解決辦法:
1、使用nohup命令: nohup <command> [argument…] & nohup可以遮蔽SIGHUP訊號!
你是不是經常需要 SSH 或者 telent 遠端登入到 Linux 伺服器?你是不是經常為一些長時間執行的任務而頭疼,比如系統備份、ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠端終端視窗,因為他們執行的時間太長了。必須等待它執行完畢,在此期間可不能關掉視窗或者斷開連 接,否則這個任務就會被殺掉,一切半途而廢了。
讓我們來看看為什麼關掉視窗/斷開連線會使得正在執行的程式死掉。
在Linux/Unix中,有這樣幾個概念:
- 程序組(process group):一個或多個程序的集合,每一個程序組有唯一一個程序組ID,即程序組長程序的ID。
- 會話期(session):一個或多個程序組的集合,有唯一一個會話期首程序(session leader)。會話期ID為首程序的ID。
- 會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連線的會話期首程序叫做控制程序(controlling process)。當前與終端互動的程序稱為前臺程序組。其餘程序組稱為後臺程序組。
根據POSIX.1定義:
- 結束通話訊號(SIGHUP)預設的動作是終止程式。
- 當終端介面檢測到網路連線斷開,將結束通話訊號傳送給控制程序(會話期首程序)。
- 如果會話期首程序終止,則該訊號傳送到該會話期前臺程序組。
- 一個程序退出導致一個孤兒程序組中產生時,如果任意一個孤兒程序組程序處於STOP狀態,傳送SIGHUP和SIGCONT訊號到該程序組中所有程序。
因此當網路斷開或終端視窗關閉後,控制程序收到SIGHUP訊號退出,會導致該會話期內其他程序退出。
如果我們可以忽略SIGHUP訊號,關掉視窗應該就不會影響程式的運行了。nohup命令可以達到這個目的,如果程式的標 準輸出/標準錯誤是終端,nohup預設將其重定向到nohup.out檔案。值得注意的是nohup命令只是使得程式忽略SIGHUP訊號,還需要使用 標記&把它放在後臺執行。