如何在多个标签页/终端中同时运行相同的Linux命令?

3
在Linux中是否有任何工具或命令可以同时在多个选项卡中运行一个命令?我想要在多个shell中同时运行相同的命令:./myprog argument1 argument2(我想增加这个数量以后来测试线程程序中的互斥锁是否正常)。我希望能像wall命令一样使用某种东西。我可以考虑使用tty,但是如果要将此扩展到更多的shell,则会非常痛苦。

1
我已经使用 tmux 命令完成了它,但我的代码非常糟糕,因为我是在分割窗格而不是使用窗口,这可能是正确的方法。 - o11c
9个回答

2
为什么不做类似以下的事情:
for i in {1..100}
do
    ./myprog argument1 argument2 &
done

如果使用的是bash shell,可以采用以下方式进行循环。对于其他shell,可以尝试其他循环结构。


这会在同一个 shell 中多次运行相同的命令。(而且是顺序执行。) - Arpith
2
为什么需要多个shell?如果您想要分离的shell,您可以使用/bin/sh -c ./myprog argument1 argument2&命令。由于&将它们置于后台,因此它们是并行的。 - Subhasis Das
啊,我没看到那个&符号。但是这仍然没有帮助。我们就假设我想要看到每个命令行用户输入命令后在他们各自的shell中看到的内容,因此我想要从终端的不同shell/选项卡中查看它。 - Arpith
这会破坏输出,不是最优的选择。 - Noufal Ibrahim

2

使用重定向输出异步运行作业是最简单的解决方案,但如果您确实希望每个进程在自己的终端中运行,一个好的选择是使用终端仿真器,如screentmux。例如:

yes | sed 5q | while read k; do  # iterate 5 times
  tmux new-session -d 'sh -c "/path/to/myprog arg1 arg2; sh"'&
done

末尾的 sh 会导致会话在 myprog 结束后仍然保持活动状态,而最初的 yes 管道被使用,而不是 seq,因为它可以在没有 seq 的情况下工作(有很多迭代的方法!)

一旦会话正在运行,您可以单独附加到它们以查看输出。 (有关详细信息,请参见 tmux 文档。)


1

安装moreutils包(使用非GNU parallel)或更好的选择是GNU parallel(通常单独打包;SUSE称其为gnu_parallel,Ubuntu和RedHat称其为parallel),以便您可以使用parallel。然后找出如何指定命令运行的终端。例如

parallel yourscript -- tty1 tty2 pts6

然后,您只需想办法编写“yourscript”以将tty作为参数运行,这是一个单独的问题。 :)

请注意,moreutils不是GNU,而moreutils中的parallel也不是GNU Parallel,而是另一个程序。 - Ole Tange
@OleTange 很好的发现。已编辑。 - dannysauer

1
如果您正在使用GNOME终端,请尝试这个。
gnome-terminal --maximize --tab-with-profile=default -e '/bin/sh -c ./myprog argument1 argument2' --tab-with-profile=default -e '/bin/sh -c ./myprog argument1 argument2' --tab-with-profile=default -e '/bin/sh -c ./myprog argument1 argument2'

请查看gnome-terminal的手册页面以获取更多选项


1
使用GNU Parallel的--tmux --fg参数:
parallel -j20 --tmux --fg echo doit {}\; sleep {} ::: {1..100}

使用 ctrl-b nctrl-b p 在运行的终端之间循环切换。这样,您可以在单个窗口中保留所有内容,但不会混淆作业的输出。

2
尽管 Github 上显示你是在一年后才编写了这个功能,但现在它已经成为最佳解决方案。我很高兴被带回来了解到它的存在。 :D - dannysauer

0

我在大学时也遇到了同样的情况,我做了类似于这样的事情

for i in $(seq 1 10)
do
  xterm -e "./myprog argument1 argument2"&
done

这将在后台生成10个xterm,每个xterm都运行您的程序。


0

从评论中看来,您不需要标准输入(stdin),需要标准输出(stdout),不需要伪终端(ptys),也不需要 screen 或者 tmux

非常简单:

for seq in `seq 5`; do
        ./myprog argument1 argument2 >output$seq &
done

0

也许你可以使用clusterssh来完成这个任务?


-1

打开一堆终端,把所有东西都设置好,然后在每个终端里尽快按下“Enter”键。


3
这正是UNIX设计的初衷所在,避免出现这种情况。 - Noufal Ibrahim
在“多个选项卡”中?我不确定Unix甚至考虑过选项卡。也许他可以使用curses库,但是谁还在使用它呢?这是长期项目的一部分吗?还是他正在进行的一种测试? - Emery Lapinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接