2017-07-18 21 views
-1

私はSSH経由でサーバーに接続するforループを持っていますが、いくつかのプロセスを終了します。私が実行している問題は、私のプログラムが動作しないすべてのプロセス(SSHを含む)を強制終了した後にサーバーに再接続しようとしていることです。プログラムがクラッシュします。3秒後にSSHセッションを閉じる

3秒後にssh接続を閉じ、forループを使用して移動するにはどうすればよいですか?

for i := 0; i < 900; i++ { 
    // pick random number 
    randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))]) 

    // print info 
    logrus.Warn("Loop: ", i) 
    logrus.Warn("Connecting to: ", randomServer) 

    // connect to server 
    cli := ssh.NewSSHClient("root", randomServer) 

    // execute any command 
    cli.ExecuteCmd("killall5") 
    cli.ExecuteCmd("exit") 
} 

答えて

0

私はそれはあなたがSSH接続が正常に確立されたかどうかを確認する必要があるプログラムのクラッシュを避けるためにthis

することができますが、何のsshのlibを使用している知っているが、あなたのコードに基づいていません。 ...パッケージは、などを使用している...どのようにあなたが投稿コードから欠落しているビットがありssh.NewSSHClient

for i := 0; i < 900; i++ { 
    // pick random number 
    randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))]) 

    // print info 
    logrus.Warn("Loop: ", i) 
    logrus.Warn("Connecting to: ", randomServer) 

    // connect to server 
    cli, err := ssh.NewSSHClient("root", randomServer) 
    if err != nil { 
     fmt.Println(err) 
     continue; 
    } 

    // execute any command 
    cli.ExecuteCmd("killall5") 
    cli.ExecuteCmd("exit") 
} 
0

によって生成このチェックエラーを行うには、しかし、例として私が使用するコードを提供してきましたコンテキストパッケージを使用して3秒のタイムアウトを追加します。あなたはこれを適切に修正することができますが、文脈の使用はここでは非常に適切だと思います。あなたがそれらを使用したことがない場合は、標準ライブラリのドキュメントhereを参照して、いくつかの例を検索してください。

// whatever this is 
var serverList []string 

func serverStuff(ctx context.Context, loop int, server string) { 
    // print info 
    logrus.Warn("Loop: ", loop) 
    logrus.Warn("Connecting to: ", server) 

    // connect to server 
    cli := ssh.NewSSHClient("root", server) 
    // execute any command 
    cli.ExecuteCmd("killall5") 
    return 
} 

func main() { 

    for i := 0; i < 900; i++ { 
     // pick random number 
     // create a context that waits 3 seconds 
     ctx := context.Background() 
     ctx, cancel := context.WithTimeout(ctx, 3*time.Second) 
     defer cancel() 

     randomServer := fmt.Sprint(serverList[rand.Intn(len(serverList))]) 
     go serverStuff(ctx, i, randomServer) 
     for { 
      select { 
      case <-ctx.Done(): // 3 seconds have passed break this loop bring us back to the top 
       break 
      } 
     } 
    } 
} 
関連する問題