我有一个for循环,它将通过SSH连接到服务器,杀死一些进程。我遇到的问题是我的程序在杀死所有无效的进程(包括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 :(得分:0)
我不知道您使用的是什么ssh lib,但根据您的代码可以this
为避免程序崩溃,您需要检查ssh连接是否已成功建立。为此,请检查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")
}
答案 1 :(得分:0)
您发布的代码中有一些缺失。比如正在使用哪些软件包等。但是作为示例,我提供了使用上下文软件包添加3秒超时的代码。你可以根据需要修改它,但我认为在这里使用上下文是非常合适的。如果您从未使用它们,请参阅标准库文档here并进行一些Google搜索以获取更多示例。
// 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
}
}
}
}