web-dev-qa-db-ja.com

同じLinuxコマンドを複数のタブ/シェルで同時に実行するにはどうすればよいですか?

Linuxに複数のタブで同時にコマンドを実行するために使用できるツール/コマンドはありますか?同じコマンドを実行したい:./myprog argument1 argument2複数のシェルで同時に実行して、ミューテックスがスレッド化されたプログラムで正常に動作しているかどうかを確認します。このプログラムのインスタンス数を増やして、後でコードにストレスをかけることができるようにしたいと考えています。

壁のようなものを探しています。私はttyを使用することを考えることができますが、これをさらに多くのシェルにスケーリングする必要がある場合、それは非常に苦痛のように思えます。

37
Arpith

Mavillanがすでに提案したように、 ターミネーター を使用してください。多くの端末を並べて表示することができます。グリッドアイコン(左上)をクリックして[すべてをブロードキャスト]を選択してブロードキャスト機能を有効にすると、各端末でまったく同じコマンドを同時に入力できます。

以下は、32個の端末のグリッドにブロードキャストされるdateコマンドの例です。

terminatorx32

49
jlliagre

tmux にはこの機能があります。 (同じように他の多くの便利な機能とともに)

次の方法で実行できます。

:setw synchronize-panes on
11

ITerm2を使用して実現できます。

参照: http://korishev.com/blog/2014/02/28/iterm2-broadcast-input/

enter image description here

10
Rajesh

Multixterm

リストに追加する別のツールは multixterm と呼ばれるものです。 xterm端子を使用します。次のように呼び出すことができます。

$ multixterm

一度起動すると、GUIが表示されます。

ss of gui

次に、new xtermボタンをクリックして、xtermウィンドウのスピンアップを開始できます。ここでは、例として2を呼び出しました。次にプライマリウィンドウをクリックすると、両方のウィンドウで同時にコマンドの入力を開始できます。

ss of xtems

キーボードキャスト

Ubuntuでのみ利用できるように見え、multixtermに似ています。

抜粋

キーボードキャストの目的は、キーストロークを複数のXウィンドウに一度に送信できるようにすることです。これにより、たとえば、一括管理の目的で、異なるが類似したホストに接続された多数の端末を制御できます。

非ターミナルを選択することもできます。あなたがこの能力の合理的な使用法を思いついたら、私はそれについて聞いてみたいと思います。

プログラムは、タイトルを一致させるか(部分文字列を使用)、または(GIMPのスクリーンショット機能と同様の方法で)それらをクリックして、送信先のウィンドウを選択できます。

このプログラムは、複数の引数で単一のコマンドを実行する(たとえば、複数のホストで「ssh」を実行する)gnome-terminalの複数のインスタンスを生成する機能も備えています。 gnome-terminalsは、プロファイル 'keyboardcast'が存在する場合、それを使用して呼び出されます(たとえば、フォントサイズを小さくすることができます)。

9
slm

次のようなことができます:

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

画面はさらに手作業が必要です。

8
BitsOfNix

私はKDEユーザーです。KDE4.13.3のkonsole 2.13.2を使用すると、次のことができます。

  1. コンソールを開く

  2. ビューを垂直に分割 enter image description here

  3. ウィンドウ内の各端末で同時に書き込み enter image description here

6
nulll

ターミネーター(エミュレーター端末)を試してください。同じウィンドウに多数のシェルセッションを設定でき、すべてのセッションにコマンドをブロードキャストできます。

ターミネーター

4
mavillan

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
3
John B

MobaXtermなどのツールを使用すると、同時に接続して、すべてのウィンドウにコマンドを貼り付けることができます。

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

上記の@mswのコメントに同意します。これにより、バックグラウンドのshプロセスによって起動されるスクリプトが作成され、子shプロセスのpidが出力されるので、そのプロセスとその子プロセスを監視できます。

2
mikeserv

@Jinpengは GNU Parallel で正しい軌道に乗っていましたが、実装ではありませんでした。

例:プログラムの10個の並列インスタンスを実行し、各スレッドは1回だけプログラムを実行します

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

例:10個の並列スレッドを実行し、それらのスレッドのそれぞれがプログラムを無限に実行します:

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

この例の10を置き換えることで、これを数百のスレッドに簡単にスケールできます。

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

プログラムがstdoutメッセージを生成し、それらを生成するときに(それらを照合するデフォルトではなく)メッセージを表示したい場合は、parallelの--ungroupオプションが役立つ場合があります。

parallel --ungroup   ...

ワークステーションから多くのスレッドを実行していて、応答が遅くならないようにしたい場合は、起動時にプロセスサブツリー全体をNiceingすることを検討してください。

Nice -n19 parallel   ...

補足:GNU Parallelは通常デフォルトではインストールされませんが、通常は通常のパッケージリポジトリにあります。したがって、他のパッケージと同じようにインストールしてください:dnf install parallelapt-get install parallelbrew install parallelなど.

2
Joshua Huber

konsoleDCOPを制御できます。例は ここから です。

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

gnu parallelはまさにあなたが探しているツールです。 parallel -j 9 yourcommand

1
Jingpeng Wu

Nohup を使用すると、プロセスをバックグラウンドで開始できます。

例:

Nohup ./myprog -arg1 -arg2 &

出力:

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

指定したPIDを使用して、後でタスクを強制終了することを忘れないでください。

kill 1769

プロセスをフォアグラウンドで実行するには、ジョブ番号を入力する必要があります。この場合は[1]

fg %1
1
TaXXoR

粉砕する私の少し:

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

1つのグループ内の多くのウィンドウに対してターミネーター構成(レイアウト用語)を作成します。

編集:少なくとも、ターミネーターは同じグループ内のすべての端末にブロードキャストを送信できます。この機能は切り替え可能です。つまり、「su-」を書き込んで有効にし、次にowenパスワードを無効にして、once端末に書き込み、再度有効にします。

0
Marek