bash或python命令循环遍历终端并在其上执行命令?

bash或python命令循环遍历终端并在其上执行命令?,python,bash,terminal,Python,Bash,Terminal,以简化的形式说明问题: 我使用两个bash终端通过ssh连接到两台服务器,并在服务器上运行程序,我需要不断查看这些服务器的输出。Server1的输出显示在terminal1上,Server2的输出显示在terminal2上 有没有一种方法可以运行一个脚本,该脚本可以知道有多少终端处于打开状态,并能够在它们之间循环并在它们上执行bash命令 伪代码: open terminal1 run program1 open terminal2 run program2 switch to terminal

以简化的形式说明问题: 我使用两个bash终端通过ssh连接到两台服务器,并在服务器上运行程序,我需要不断查看这些服务器的输出。Server1的输出显示在terminal1上,Server2的输出显示在terminal2上

有没有一种方法可以运行一个脚本,该脚本可以知道有多少终端处于打开状态,并能够在它们之间循环并在它们上执行bash命令

伪代码:

open terminal1
run program1
open terminal2
run program2
switch to terminal1
run program3 on terminal1
查看了xterm的手册页,但没有在终端之间切换的选项。
我能得到的最接近的是和。但这两种方法都没有帮助。

(参见[5]:导入子流程)
在[6]中:导入shlex
[7]中:subprocess.Popen(shlex.split('gnome-terminal-xbash-c“ls;read-n1“))
出[7]:

可以选择
屏幕
。根据需要拆分屏幕后,您可以从单独的终端向其中一个发送命令,例如:

tmux send-keys -t sessionname:0.0 "ls -al" "Enter"
tmux send-keys -t sessionname:0.1 "ls -al" "Enter"
-t
选项引用“sessionname”:“窗口编号”、“窗格编号”。我相信你可以用
屏幕做类似的事情,但我从来没有用过


另一个选项,如果有两个单独的屏幕不是很相关的话,那就是Python实用程序。您可以为多台服务器编写命令脚本并获取结果。

在类似的情况下,创建运行
屏幕的
bash
脚本是我的解决方案。 您可以使用
screen
创建屏幕会话,并在其中创建多个编号的窗口,并在这些窗口上执行命令

我在一个有8台计算机的集群上运行一个scrip,所以我在每个集群中运行
ssh
,并运行命令
htop
,检查是否没有人在使用

标志
-S
在屏幕上命名会话,
-p
枚举会话窗口,
-X stuff
运行命令。请注意,要运行命令
需要在新行上模拟回车(Enter)

这是剧本

#!/bin/bash
screen -d -m -S dracos
# window 0 is created by default, command ssh is executed " needed in new line to simulate pressing Enter
screen -S dracos -p 0 -X stuff "ssh draco1
"
screen -S dracos -p 0 -X stuff "htop
"
for n in {2..8}; do
  # create now window using `screen` command
  screen -S dracos -X screen $n
  #ssh to each draco
  screen -S dracos -p $n -X stuff "ssh draco$n
"
  #run htop in each draco
 screen -S dracos -p $n -X stuff "htop
"
screen -S dracos -p $n -X stuff "<your_new_command_here>
"
done

解决方案旨在使用
python
。或bash。它不是特定于语言的,所以我扩大了可用工具的范围。屏幕是一个很好的选项。啊,我明白了,误解了,对不起。没有看到其他答案是你。继续。谢谢,但要在屏幕之间切换,我必须使用Ctrl+a键。我想要一种使用s的方法script.Screen可以使用
-X
选项编写脚本:呃…我不熟悉Python和bash脚本。Python不识别“in[5]”等,因此无法理解代码的作用。帮助?它是直接从Python提示符复制的(不是标准提示符,SciPy?)。在[5]中“etc不是脚本的一部分。如何在终端之间切换?我试图将subprocess.Popen的返回值存储在一个变量中以访问它打开的shell,但每次尝试都会出现语法错误。@Nav:您需要有效地使用subprocess.communicate()和subprocess.Popen(),您不能切换终端,但可以在两个进程之间传递消息,这两个进程将执行两个不同的任务,如果您只想获得输出,请使用subprocess.getoutput()我还想链接到另一个有用的答案:
#!/bin/bash
screen -d -m -S dracos
# window 0 is created by default, command ssh is executed " needed in new line to simulate pressing Enter
screen -S dracos -p 0 -X stuff "ssh draco1
"
screen -S dracos -p 0 -X stuff "htop
"
for n in {2..8}; do
  # create now window using `screen` command
  screen -S dracos -X screen $n
  #ssh to each draco
  screen -S dracos -p $n -X stuff "ssh draco$n
"
  #run htop in each draco
 screen -S dracos -p $n -X stuff "htop
"
screen -S dracos -p $n -X stuff "<your_new_command_here>
"
done
screen -S dracos -p $n -X stuff "<your_new_command_here>