【问题标题】:Run multiple commands simultaneously in bash in one line在一行中同时在bash中运行多个命令
【发布时间】:2021-08-04 08:47:47
【问题描述】:

我正在寻找类似ssh user@node1 uptime && ssh user@node2 uptime 的替代方案,其中两个 SSH 命令同时运行。由于它们在命令返回之前都处于阻塞状态,因此它们之间的&&; 不起作用。

我的目标是通过 SSH 在两个节点上运行无限 while 循环。所以第一个永远不会返回,第二个永远不会运行。然后,我想在使用 Ctrl+C 终止循环后将输出保存到日志文件中,并通过 Python 读取该输出。

有没有简单的解决方案?

提前致谢!

【问题讨论】:

  • 使用&在后台运行第一个命令。不过,你不能用Ctrl+C 来阻止它。
  • @StefanWobbe:这里没有发生正确意义上的阻塞。它们只是按顺序运行(并且,如果您使用&&,则仅当第一个命令成功时才会运行第二个命令)。 “相互阻塞”意味着程序以某种方式进行通信,可能是通过一个公共信号量。当然ssh user@node1 uptime & ssh user@node2 uptime 会以并行方式运行它们,但我看不出从中获得多少收益,因为无论如何 uptime 应该会很快返回。
  • 使用& 而不是&&

标签: bash shell ssh


【解决方案1】:

捕获 SSH 输出

一方面,您需要捕获 ssh 输出/错误并将其存储到文件中,以便以后可以使用 Python 处理它。为此,您可以:

1- 将输出和错误直接存储到文件中

ssh user@node cmd 2>&1 > session.log

2- 在控制台中显示输出/错误,同时将其存储到文件中(我会推荐这个)

ssh user@node cmd 2>&1 | tee session.log

查看this 了解有关tee 命令的更多信息。

并行运行命令

另一方面,您希望并行运行这两个命令并阻止当前的 bash 进程。您可以通过以下方式实现:

1- 阻塞当前的 bash 进程,直到他们的子进程完成。

cmd1 & ; cmd2 & ; wait

查看this 以获取有关wait 命令的更多信息。

2- 生成子进程并释放当前的 bash 进程。请注意,尽管主进程结束,这些进程仍将保持活动状态。

nohup cmd & ; nohup cmd & 

整件事

我建议使用 tee 结合这两种方法(这样您仍然可以在终端上看到 ssh 输出)并阻塞当前进程,直到一切完成(这样当您终止主进程时,所有进程也被终止)。

ssh user@node1 uptime 2>&1 | tee session1.log & ; ssh user@node2 uptime 2>&1 | tee session2.log & ; wait

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多