在一行bash中同时运行多个命令
我正在寻找类似在一行bash中同时运行多个命令,bash,shell,ssh,Bash,Shell,Ssh,我正在寻找类似ssh的替代方案user@node1正常运行时间&sshuser@node2正常运行时间,其中两个SSH命令同时运行。由于它们都在阻塞直到命令返回,&&和它们之间不起作用 我的目标是通过SSH在两个节点上运行无限while循环。因此,第一个将永远不会返回,第二个将永远不会运行。然后,我希望在使用Ctrl+C终止循环后将输出保存到日志文件中,并通过Python读取该文件 有没有简单的解决办法 提前谢谢 捕获SSH输出 一方面,您需要捕获ssh输出/错误并将其存储到文件中,以便以后可以
ssh的替代方案user@node1正常运行时间&sshuser@node2正常运行时间
,其中两个SSH命令同时运行。由于它们都在阻塞直到命令返回,&&
和代码>它们之间不起作用
我的目标是通过SSH在两个节点上运行无限while循环。因此,第一个将永远不会返回,第二个将永远不会运行。然后,我希望在使用Ctrl+C终止循环后将输出保存到日志文件中,并通过Python读取该文件
有没有简单的解决办法
提前谢谢 捕获SSH输出
一方面,您需要捕获ssh输出/错误并将其存储到文件中,以便以后可以使用Python进行处理。为此,您可以:
1-将输出和错误直接存储到文件中
ssh user@node cmd 2>&1 > session.log
2-在控制台中显示输出/错误,同时将其存储到文件中(我建议使用此选项)
检查有关tee
命令的更多信息
并行运行命令
另一方面,您希望并行运行这两个命令并阻止当前bash进程。您可以通过以下方式实现此目的:
1-阻止当前bash进程,直到完成其子进程
cmd1 & ; cmd2 & ; wait
查看有关wait
命令的更多信息
2-生成子进程并释放当前bash进程。请注意,尽管主进程结束,但这些进程仍将保持活动状态
nohup cmd & ; nohup cmd &
整件事
我建议使用tee将这两种方法结合起来(这样您仍然可以在终端上看到ssh输出),并阻塞当前进程,直到所有事情都完成(这样,当您终止主进程时,所有进程也将终止)
捕获SSH输出
一方面,您需要捕获ssh输出/错误并将其存储到文件中,以便以后可以使用Python进行处理。为此,您可以:
1-将输出和错误直接存储到文件中
ssh user@node cmd 2>&1 > session.log
2-在控制台中显示输出/错误,同时将其存储到文件中(我建议使用此选项)
检查有关tee
命令的更多信息
并行运行命令
另一方面,您希望并行运行这两个命令并阻止当前bash进程。您可以通过以下方式实现此目的:
1-阻止当前bash进程,直到完成其子进程
cmd1 & ; cmd2 & ; wait
查看有关wait
命令的更多信息
2-生成子进程并释放当前bash进程。请注意,尽管主进程结束,但这些进程仍将保持活动状态
nohup cmd & ; nohup cmd &
整件事
我建议使用tee将这两种方法结合起来(这样您仍然可以在终端上看到ssh输出),并阻塞当前进程,直到所有事情都完成(这样,当您终止主进程时,所有进程也将终止)
使用&
在后台运行第一个命令。但是,你不能用Ctrl+C组合键来停止它。@StefanWobbe:这里没有正确意义上的阻塞。它们只是按顺序运行(并且,如果使用&&&
,则只有在第一个命令成功时才运行第二个命令)。“互相阻塞”意味着程序以某种方式进行通信,可能是通过一个公共信号量。当然sshuser@node1正常运行时间&sshuser@node2正常运行时间
将在parralel中运行它们,但我看不出有什么好处,因为正常运行时间应该很快就会恢复。使用&
而不是&
。使用&
在后台运行第一个命令。但是,你不能用Ctrl+C组合键来停止它。@StefanWobbe:这里没有正确意义上的阻塞。它们只是按顺序运行(并且,如果使用&&&
,则只有在第一个命令成功时才运行第二个命令)。“互相阻塞”意味着程序以某种方式进行通信,可能是通过一个公共信号量。当然sshuser@node1正常运行时间&sshuser@node2正常运行时间
将在parralel中运行,但我看不到有什么好处,因为正常运行时间应该很快就会恢复。使用&
而不是&
。