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


33

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

壁のようなものを探しています。ttyを使用することも考えられますが、これをもっと多くのシェルに拡張する必要がある場合、それは非常に苦痛のように思えます。


1
「コンピューターに関連する反復タスクを実行しているときはいつでも、それを自動化してください」— 。負荷テストのために複数のターミナルタブを使用することで、自分で障害を起こしている可能性があると思います。子myprogインスタンスを生成して出力を集約するプログラムを1つ用意する方がよいでしょう。
msw

1
通常のマルチスレッドでは、プロセス間でミューテックスが使用されません...?
アーロンD.マラスコ

@msw:ええ、しかし、エンドユーザーが端末から同じコマンドを実行したときに表示されるものを確認したい場合、100に変更すると、画面に何が表示されますか?それは決定するのに有効なものではありませんか?
アーピス

@ AaronD.Marasco:ユーザー空間で、入れたミューテックスを確認したい。
アーピス

したがって、1つのスーパーバイザーの下で99個のインスタンスを実行し、ターミナルで100番目のインスタンスを実行します。私はあなたが100台の端末を同時に見ることができるかもしれないと認めています、もしそうなら、私は感銘を受けました。
msw

回答:


46

mavillanがすでに示唆したように、単にterminatorを使用します。多くの端末をタイル状に表示できます。ブロードキャスト機能を有効にすると、各端末でまったく同じコマンドを同時に入力できます。

32個の端末のグリッドにブロードキャストされるdateコマンドの例を次に示します。

ターミネーター


3
くそー、これはすごい!
14

32個の端末を簡単に開くにはどうすればよいですか?
アナン

6
@Annanターミネーターはカスタムレイアウトをサポートし、unix.stackexchange.com / a
168445/2594


9

Multixterm

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

$ multixterm

そして、一度GUIが表示されます。

                                                         ss of gui

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

   ss of xtems

キーボードキャスト

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

抜粋

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

非端末を選択することもできます。この能力を合理的に使用することを考えた場合、私はそれについて聞いてみたいと思います。

プログラムは、タイトルを一致させる(サブストリングを使用)か、クリックする(GIMPのスクリーンショット機能に似た方法で)ことにより、送信するウィンドウを選択できます。

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


キーパー!注意してください。
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

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


画面ソリューションをさらに拡張していただけますか?もっと私が欲しいものに沿って
...-アルピス

tail -f100個の画面を設定するのではなく、ログファイルだけではありません。
ライライアン

@Arpithは、単一の端末で複数の端末を生成します。すべてを「リアルタイム」で表示したい場合は、画面を使用できます。個人的にはログファイルを使用しますが、メッセージを送信するようにプログラムを設定するか、実際に各インスタンスのログファイルを書き込む独自のプログラムを持つことができます(例:myprog.pid.log)
BitsOfNix

@LieRyanは、syslogのようなものでログを記録しない限り、プロセスごとに個別のファイルに記録する必要があるためです。20を超えるプロセスが同じファイルに同時に書き込むようにしようとすると、悪い時間を過ごすことになります。
サミッチ

@サミッチ:tail -f *.log
ライライアン

5

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

  1. オープンコンソール

  2. ビューを垂直に分割 ここに画像の説明を入力してください

  3. ウィンドウ内の各端末に同時に書き込みます ここに画像の説明を入力してください


4

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

ターミネーター


3

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


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個の並列インスタンスを実行し、各スレッドはプログラムを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メッセージを生成し、それらを(それらを照合するデフォルトではなく)生成されたとおりに表示したい--ungroup場合は、parallelオプションが便利です。

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


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

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

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


1
良いですか?申し訳ありませんが、英語が気に入らない:)
マレク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.