如何在多个选项卡/外壳中同时运行同一Linux命令?


33

Linux中是否有任何工具/命令可用于在多个选项卡中同时运行命令?我想运行相同的命令:./myprog argument1 argument2同时在多个shell中检查互斥对象在线程程序中是否工作正常。我希望能够增加该程序的实例数量,以便以后使我的代码承受压力。

我有点在寻找像墙一样的东西。我可以考虑使用tty,但是如果我不得不将其扩展到更多的shell的话,这似乎很痛苦。


1
“每当您发现自己要执行涉及计算机的重复性任务时,都要对其进行自动化” – 。我认为您可能会因为使用多个终端选项卡进行负载测试而对自己造成伤害,因为您必须注意所有繁琐的工作。最好有一个程序可以生成子myprog实例并为您聚合它们的输出。
msw

1
普通的多线程进程之间不会互斥...?
亚伦·马拉斯科

@msw:是的,但是如果我想查看最终用户从终端运行相同命令时看到的结果,当我将其缩放为100时,他们会在屏幕上看到什么?这不是一个有效的决定吗?
2013年

@ AaronD.Marasco:我想检查用户空间中放入的互斥锁。
2013年

因此,在一个主管下运行99个实例,在终端上运行第100个实例。我承认您可能能够同时观看100个终端,如果可以的话,我印象深刻。
msw

Answers:


46

正如mavillan已经建议的那样,只需使用终止符即可。它允许以平铺方式显示许多终端。启用广播功能时,可以在每个终端上同时输入完全相同的命令。

这是一个将日期命令广播到32个终端的网格中的示例。

终结者x32


3
该死的,太棒了!
2014年

如何轻松打开32个终端?
安南2015年

6
@Annan Terminator支持自定义布局,请查看unix.stackexchange.com/a/168445/2594askubuntu.com/a/178242/18306
jlliagre 2015年


9

多重项

另一种添加到列表中的工具称为multixterm。它使用xterm终端。您可以这样调用它:

$ multixterm

然后,您将看到一个GUI。

                                                         gui的ss

然后,您可以xterm通过单击new xterm按钮开始旋转窗口。例如,这里我调用了2。如果您单击主窗口,则可以同时在两个窗口中键入命令:

   xtems的ss

键盘广播

似乎仅在Ubuntu上可用,看起来类似于multixterm。

摘抄

键盘广播的目的是允许您将击键一次发送到多个X窗口。例如,这使您可以控制连接到不同但相似主机的多个终端,以进行大规模管理。

您也可以选择非终端。如果您对此功能有合理的用途,那么我会很感兴趣。

该程序可以通过匹配窗口的标题(使用子字符串)或单击窗口(以类似于GIMP的屏幕快照功能的方法)来选择要发送到的窗口。

该程序还具有生成gnome-terminal的多个实例的能力,这些实例在多个参数上执行单个命令(例如,在多个主机上执行“ ssh”)。如果存在配置文件“ keyboardcast”,则将调用gnome终端(例如,您的字体大小可以更小)。


守护者!注意事项。
runlevel0

似乎键盘广播已损坏,这令人失望。
RJ


8

您可以执行以下操作:

max_processes=20
for ((i=0; i<$max_processes; i++))
do 
    /path/to/myprog arg1 arg2 > /tmp/myprog.${i}.log &
done

或者,如果每个命令的输出在执行期间相关,则可以设置屏幕。

vi ~/.screenrc
screen -t inst1    1 /path/to/myprog arg1 arg2
screen -t inst2    2 /path/to/myprog arg1 arg2
screen -t inst3    3 /path/to/myprog arg1 arg2
screen -t inst4    4 /path/to/myprog arg1 arg2

屏幕需要更多的手动工作。


您能否在屏幕解决方案上进行更多扩展?更符合我想要的...
Arpith 2013年

为什么不只是tail -f日志文件而不是设置一百个屏幕。
Lie Ryan

@Arpith屏幕在一个终端中产生了多个终端。如果您想实时查看所有内容,则可以使用屏幕。尽管我个人会使用日志文件,但是您可以设置您的编来发送消息,或者实际上是您自己的编为每个实例编写日志文件(例如:myprog.pid.log)
BitsOfNix 2013年

@LieRyan因为除非您使用syslog之类的东西登录,否则您必须为每个进程登录到一个单独的文件。如果您只是想同时让20个以上的进程同时写入同一个文件,那将是一段糟糕的时光。
Sammitch

@Sammitch:tail -f *.log
Lie Ryan

5

我是KDE用户,在KDE 4.13.3上使用konsole 2.13.2,您可以执行以下操作:

  1. 开孔底

  2. 垂直分割视图 在此处输入图片说明

  3. 在窗口内的每个终端上同时写入 在此处输入图片说明


4

尝试终结器(仿真器终端)。它可以在同一窗口中有许多shell会话,您可以向所有它们广播命令。

终结者


3

您可以使用MobaXterm之类的工具,它将允许您同时连接,然后将命令粘贴到所有Windows中。


与mobaxterm无关,Linux与之无关,它的功能令人印象深刻,它仅是Windows,问题显然是关于Linux解决方案的。
RJ

3

如果只想查看第100个程序执行的输出:

#!/bin/bash

prog="/path/to/myprog"
args="argument1 argument2"
max=100
for i in $(seq $max); do
    if [ $i -lt $max ]; then
        exec $prog $args &> /dev/null &
    else
        exec $prog $args
    fi
done

2

您可以konsole通过控制DCOP。一个例子是从这里

#!/bin/bash

checkfile() {
  if [ ! -f $1 ]; then
    echo "could not find $1"
    exit 99
  else
    echo "OK"
  fi
}

# Check for App1 XML
echo -n "Checking for App 1 XML... "
XMLA=/domain/DM.xml
checkfile ${DEVROOT}/${XMLA}

# Check for App2 XML
echo -n "Checking for App 2 XML... "
hostname=$(hostname)
XMLB=/domain/DM_${hostname}.xml
checkfile ${DEVROOT}/${XMLB}

# Launch Konsole
echo -n "Launching konsole... "
K=$(dcopstart konsole-script)

[ -z "${K}" ] && exit 98
# Create second tab and resize
SDA=$(dcop $k konsole currentSession)
SDB=$(dcop $k konsole newSession)
dcop $K $SDA setSize 121x25

# Let bash login, etc.
sleep 1

# Rename the tabs
dcop $K $SDA renameSession "App 1"
dcop $K $SDB renameSession "App 2"

# Start services, letting user watch
echo -n "starting app1... "
dcop $K konsole activateSession $SDA
dcop $K $SDA sendSession "echo -ne '\033]0;DEV (${hostname})\007' && clear && starter $XMLA"
sleep 2
echo -n "starting app2... "
dcop $K konsole activateSession $SDB
dcop $K $SDB sendSession "echo -ne '\033]0;DEV (${hostname})\007' && clear && starter $XMLB"
echo done.

2
sh <<-STRESS & 
$( printf 'myprog &\n%.0b' \
    `seq 1 ${MAX_CONCURRENT_PROCS}` )
STRESS
echo "$!"

我同意@msw在上面的评论。这将为您编写一个由后台sh进程启动的脚本,并打印出子sh进程的pid,以便您可以监视它及其子进程。


2

@Jinpeng使用GNU Parallel处于正确的轨道,只是没有实现。

示例:运行程序的10个并行实例,每个线程仅运行一次程序:

parallel -j10 './myprog argument1 argument2 #' ::: {1..10}

示例:运行10个并行线程,每个线程无限地运行您的程序:

parallel -j10 'while true ; do ./myprog argument1 argument2 ; done #' ::: {1..10}

通过替换10示例中的,您可以轻松地将其扩展到数百个线程。

parallel -j200     ...     ::: {1..200}

如果您的程序生成任何标准输出消息,并且您希望在生成它们时查看它们(而不是整理它们的默认值),则--ungroup并行选项可能会很有用。

parallel --ungroup   ...

如果您从工作站运行大量线程,并且不想让事情变得无响应,请考虑nice在启动时对整个进程子树进行处理。

nice -n19 parallel   ...

侧面说明,GNU并行通常不是默认安装的,但通常是在你的正常包回购,所以只需安装它像任何其他包:dnf install parallelapt-get install parallelbrew install parallel等。


1

您可以使用在后台启动进程nohup

例:

nohup ./myprog -arg1 -arg2 &

输出:

[1] 1769    
nohup: ignoring input and appending output to 'nohup.out'

请记住稍后使用给定的命令终止任务PID

kill 1769

要使该流程处于前台,您必须输入作业号,在这种情况下[1]

fg %1

1

gnu parallel正是您要寻找的工具。 parallel -j 9 yourcommand


0

我的小磨坊:

#!/bin/sh

[ $# -lt 1 ] && {
        echo "Use: $0 <file>
        where file includes list of server"
        exit 9
}

cp ~/.config/terminator/config ~/.config/terminator/config.`date +%Y%m%d-%H%M`

cat ~/.config/terminator/config.`date +%Y%m%d-%H%M`|grep -v "^.plugins" >~/.config/terminator/config

inc=5
echo "  [[terms]]" >>~/.config/terminator/config
for i in `cat $1` ; do
        echo "   [[[window${inc}]]]"
        echo "       type = Window"
        echo "   [[[terminal${inc}]]]"
        echo "     profile = default"
        echo "     order = 0" 
        echo "     type = Terminal"
        echo "     parent = window${inc}"
        echo "     command = ssh $i"
        inc=$((inc+1))
done >>~/.config/terminator/config

echo "[plugins]" >>~/.config/terminator/config

将为一组中的多个窗口进行终结器配置(布局术语)。

编辑:至少,终结者能够将广播发送到同一组中的每个终端。此功能是可切换的-因此您可以启用它写'su-',然后禁用并向一次终端写入密码,然后再次启用它。


1
是不是更好?不好意思,请问英语:)
Marek '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.