bash - 在一行中同时在bash中运行多个命令
问题描述
我正在寻找类似的替代方法ssh user@node1 uptime && ssh user@node2 uptime
,其中两个 SSH 命令同时运行。因为它们在命令返回之前都处于阻塞状态,&&
并且;
它们之间不起作用。
我的目标是通过 SSH 在两个节点上运行无限 while 循环。所以第一个永远不会返回,第二个永远不会运行。然后,我想在使用 Ctrl+C 终止循环后将输出保存到日志文件并通过 Python 读取该输出。
有一个简单的解决方案吗?
提前致谢!
解决方案
捕获 SSH 输出
一方面,您需要捕获 ssh 输出/错误并将其存储到文件中,以便以后可以使用 Python 处理它。为此,您可以:
1-将输出和错误直接存储到文件中
ssh user@node cmd 2>&1 > session.log
2-在控制台中显示输出/错误,同时将其存储到文件中(我会推荐这个)
ssh user@node cmd 2>&1 | tee session.log
检查此以获取有关该tee
命令的更多信息。
并行运行命令
另一方面,您希望并行运行这两个命令并阻止当前的 bash 进程。您可以通过以下方式实现:
1-阻止当前的 bash 进程,直到他们的孩子完成。
cmd1 & ; cmd2 & ; wait
检查此以获取有关该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
推荐阅读
- scheme - Racket中list和list*的区别
- javascript - REACTJS 中状态变化的错误/问题
- r - 大字段的文本到列
- python - 将模型函数拟合到定义的数据范围
- angular - 即使在使用 clearInterval 之后,如果条件满足,我也无法停止 setInterval()
- python-3.x - 为什么在发出请求时我的网址中出现“%0A”
- javascript - 如何在 LINQPad 中的代码中单击按钮(而不是通过鼠标)?
- c++ - 带有空捕获列表的 lambda 如何工作?
- save - 如何保存完整的 Vowpal Wabbit python 模型(pyvw)?
- azure - Azure Webapp - Azure .Net SDK - 设置站点 IP 限制