Linuxに複数のタブで同時にコマンドを実行するために使用できるツール/コマンドはありますか?同じコマンドを実行したい:./myprog argument1 argument2
複数のシェルで同時に実行して、ミューテックスがスレッド化されたプログラムで正常に動作しているかどうかを確認します。このプログラムのインスタンス数を増やして、後でコードにストレスをかけることができるようにしたいと考えています。
壁のようなものを探しています。私はttyを使用することを考えることができますが、これをさらに多くのシェルにスケーリングする必要がある場合、それは非常に苦痛のように思えます。
Mavillanがすでに提案したように、 ターミネーター を使用してください。多くの端末を並べて表示することができます。グリッドアイコン(左上)をクリックして[すべてをブロードキャスト]を選択してブロードキャスト機能を有効にすると、各端末でまったく同じコマンドを同時に入力できます。
以下は、32個の端末のグリッドにブロードキャストされるdateコマンドの例です。
ITerm2を使用して実現できます。
参照: http://korishev.com/blog/2014/02/28/iterm2-broadcast-input/
リストに追加する別のツールは multixterm
と呼ばれるものです。 xterm
端子を使用します。次のように呼び出すことができます。
$ multixterm
一度起動すると、GUIが表示されます。
次に、new xterm
ボタンをクリックして、xterm
ウィンドウのスピンアップを開始できます。ここでは、例として2を呼び出しました。次にプライマリウィンドウをクリックすると、両方のウィンドウで同時にコマンドの入力を開始できます。
Ubuntuでのみ利用できるように見え、multixtermに似ています。
抜粋
キーボードキャストの目的は、キーストロークを複数のXウィンドウに一度に送信できるようにすることです。これにより、たとえば、一括管理の目的で、異なるが類似したホストに接続された多数の端末を制御できます。
非ターミナルを選択することもできます。あなたがこの能力の合理的な使用法を思いついたら、私はそれについて聞いてみたいと思います。
プログラムは、タイトルを一致させるか(部分文字列を使用)、または(GIMPのスクリーンショット機能と同様の方法で)それらをクリックして、送信先のウィンドウを選択できます。
このプログラムは、複数の引数で単一のコマンドを実行する(たとえば、複数のホストで「ssh」を実行する)gnome-terminalの複数のインスタンスを生成する機能も備えています。 gnome-terminalsは、プロファイル 'keyboardcast'が存在する場合、それを使用して呼び出されます(たとえば、フォントサイズを小さくすることができます)。
次のようなことができます:
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
画面はさらに手作業が必要です。
ターミネーター(エミュレーター端末)を試してください。同じウィンドウに多数のシェルセッションを設定でき、すべてのセッションにコマンドをブロードキャストできます。
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
MobaXtermなどのツールを使用すると、同時に接続して、すべてのウィンドウにコマンドを貼り付けることができます。
sh <<-STRESS &
$( printf 'myprog &\n%.0b' \
`seq 1 ${MAX_CONCURRENT_PROCS}` )
STRESS
echo "$!"
上記の@mswのコメントに同意します。これにより、バックグラウンドのsh
プロセスによって起動されるスクリプトが作成され、子sh
プロセスのpidが出力されるので、そのプロセスとその子プロセスを監視できます。
@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 ...
ワークステーションから多くのスレッドを実行していて、応答が遅くならないようにしたい場合は、起動時にプロセスサブツリー全体をNice
ingすることを検討してください。
Nice -n19 parallel ...
補足:GNU Parallelは通常デフォルトではインストールされませんが、通常は通常のパッケージリポジトリにあります。したがって、他のパッケージと同じようにインストールしてください:dnf install parallel
、apt-get install parallel
、 brew install parallel
など.
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.
gnu parallelはまさにあなたが探しているツールです。 parallel -j 9 yourcommand
Nohup
を使用すると、プロセスをバックグラウンドで開始できます。
例:
Nohup ./myprog -arg1 -arg2 &
出力:
[1] 1769
Nohup: ignoring input and appending output to 'Nohup.out'
指定したPID
を使用して、後でタスクを強制終了することを忘れないでください。
kill 1769
プロセスをフォアグラウンドで実行するには、ジョブ番号を入力する必要があります。この場合は[1]
:
fg %1
粉砕する私の少し:
#!/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端末に書き込み、再度有効にします。