【问题标题】:bash or python command to cycle through terminals and execute commands on them?bash 或 python 命令循环通过终端并在它们上执行命令?
【发布时间】:2011-10-31 02:40:56
【问题描述】:

以简化的形式陈述问题: 我正在使用两个 bash 终端连接到两台服务器,并在需要持续查看其输出的服务器上运行程序。服务器 1 的输出出现在终端 1 上,服务器 2 的输出出现在终端 2 上。

有没有办法运行一个脚本,它知道有多少终端是打开的,并且能够循环通过它们并在它们上执行 bash 命令?

伪代码:

open terminal1
run program1
open terminal2
run program2
switch to terminal1
run program3 on terminal1

查看了 xterm 的手册页,但没有在终端之间切换的选项。
我能得到的最接近的是thisthis。但两者都没有帮助。

【问题讨论】:

标签: python bash terminal


【解决方案1】:

【讨论】:

  • 解决方案打算使用python
  • 或 bash。它不是特定于语言的,所以我扩大了可用工具的范围。屏幕在这里是一个很好的选择。
  • 啊,我明白了,误会了,对不起。没看到另一个答案是你。摇滚吧。
  • 谢谢,但要在屏幕之间切换,我必须使用 Ctrl+a 键。我想要一种使用脚本的方法。
  • 屏幕可以使用-X 选项编写脚本:gnu.org/software/screen/manual/screen.html#Invoking-Screen
【解决方案2】:
In [5]: import subprocess

In [6]: import shlex

In [7]: subprocess.Popen(shlex.split('gnome-terminal -x bash -c "ls; read -n1"'))
Out[7]: <subprocess.Popen object at 0x9480a2c>

【讨论】:

  • 呃...我是 Python 和 bash 脚本的新手。 Python 无法识别“In [5]”等。因此无法理解您的代码的作用。帮忙?
  • 它是直接从 python 提示符复制而来的(不是标准的,SciPy?)。 “In [5]”等不是脚本的一部分。
  • 如何在终端之间切换?我尝试将 subprocess.Popen 的返回值存储在一个变量中以访问它打开的 shell,但我尝试的所有操作都不断出现语法错误。
  • @Nav:你需要有效地使用 subprocess.communicate() 和 subprocess.Popen() ,你不能切换终端,但你可以在两个进程之间传递消息,这两个进程将执行两个不同的任务和如果您只想获取输出,请使用 subprocess.getoutput()
【解决方案3】:

screen 的替代方案是tmux。根据需要拆分屏幕后,您可以从单独的终端向任一屏幕发送命令,例如:

tmux send-keys -t sessionname:0.0 "ls -al" "Enter"
tmux send-keys -t sessionname:0.1 "ls -al" "Enter"

-t 选项引用“会话名称”:“窗口编号”。“窗格编号”。我相信您可以使用 screen 做类似的事情,但我从未使用过它。

如果有两个单独的屏幕不是很相关,您可能会考虑的另一个选项是 python 实用程序fabric。您可以将命令编写到多个服务器并获取结果。

【讨论】:

    【解决方案4】:

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

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

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

    这是脚本

    #!/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
    

    如果您想以其他顺序运行命令,可以将下面的行放在for 之后

    screen -S dracos -p $n -X stuff "<your_new_command_here>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      相关资源
      最近更新 更多