Linux中是否有任何工具/命令可用于在多个选项卡中同时运行命令?我想运行相同的命令:./myprog argument1 argument2
同时在多个shell中检查互斥对象在线程程序中是否工作正常。我希望能够增加该程序的实例数量,以便以后使我的代码承受压力。
我有点在寻找像墙一样的东西。我可以考虑使用tty,但是如果我不得不将其扩展到更多的shell的话,这似乎很痛苦。
Linux中是否有任何工具/命令可用于在多个选项卡中同时运行命令?我想运行相同的命令:./myprog argument1 argument2
同时在多个shell中检查互斥对象在线程程序中是否工作正常。我希望能够增加该程序的实例数量,以便以后使我的代码承受压力。
我有点在寻找像墙一样的东西。我可以考虑使用tty,但是如果我不得不将其扩展到更多的shell的话,这似乎很痛苦。
Answers:
正如mavillan已经建议的那样,只需使用终止符即可。它允许以平铺方式显示许多终端。启用广播功能时,可以在每个终端上同时输入完全相同的命令。
这是一个将日期命令广播到32个终端的网格中的示例。
另一种添加到列表中的工具称为multixterm
。它使用xterm
终端。您可以这样调用它:
$ multixterm
然后,您将看到一个GUI。
然后,您可以xterm
通过单击new xterm
按钮开始旋转窗口。例如,这里我调用了2。如果您单击主窗口,则可以同时在两个窗口中键入命令:
似乎仅在Ubuntu上可用,看起来类似于multixterm。
摘抄
键盘广播的目的是允许您将击键一次发送到多个X窗口。例如,这使您可以控制连接到不同但相似主机的多个终端,以进行大规模管理。
您也可以选择非终端。如果您对此功能有合理的用途,那么我会很感兴趣。
该程序可以通过匹配窗口的标题(使用子字符串)或单击窗口(以类似于GIMP的屏幕快照功能的方法)来选择要发送到的窗口。
该程序还具有生成gnome-terminal的多个实例的能力,这些实例在多个参数上执行单个命令(例如,在多个主机上执行“ ssh”)。如果存在配置文件“ keyboardcast”,则将调用gnome终端(例如,您的字体大小可以更小)。
可以使用iTerm2来实现
参考:http://korishev.com/blog/2014/02/28/iterm2-broadcast-input/
您可以执行以下操作:
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
屏幕需要更多的手动工作。
tail -f
日志文件而不是设置一百个屏幕。
tail -f *.log
您可以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.
@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 parallel
,apt-get install parallel
,brew install parallel
等。
我的小磨坊:
#!/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-',然后禁用并向一次终端写入密码,然后再次启用它。
myprog
实例并为您聚合它们的输出。