Bagaimana cara menjalankan perintah linux yang sama di lebih dari satu tab / shell secara bersamaan?

33

Apakah ada alat / perintah di Linux yang dapat saya gunakan untuk menjalankan perintah di lebih dari satu tab secara bersamaan? Saya ingin menjalankan perintah yang sama:./myprog argument1 argument2 secara bersamaan di lebih dari satu shell untuk memeriksa apakah mutex berfungsi dengan baik dalam program berulir. Saya ingin dapat meningkatkan jumlah instance dari program ini sehingga membuat kode saya di bawah tekanan nanti.

Saya agak mencari sesuatu seperti apa yang dilakukan dinding. Saya bisa memikirkan menggunakan tty's, tapi itu sepertinya banyak rasa sakit jika saya harus skala ini ke lebih banyak kerang.

Arpith
sumber
1
"Setiap kali Anda menemukan diri Anda melakukan tugas berulang yang melibatkan komputer, otomatiskan itu" - saya . Saya pikir Anda mungkin merugikan diri sendiri dengan menggunakan beberapa terminal tab untuk pengujian beban karena Anda harus menonton semuanya yang membosankan. Lebih baik memiliki satu program yang memunculkan myproginstance anak dan mengumpulkan hasilnya untuk Anda.
msw
1
Multi-threading yang normal tidak akan memiliki mutex antar proses ...?
Aaron D. Marasco
@ msw: Ya, tetapi bagaimana jika saya ingin melihat apa yang akan dilihat pengguna akhir ketika dia menjalankan perintah yang sama dari terminalnya dan ketika saya diskalakan untuk mengatakan 100, apa yang akan mereka lihat di layar mereka? Bukankah itu hal yang valid untuk ditentukan?
Arpith
@ AaronD.Marasco: Saya ingin memeriksa mutex yang saya masukkan, di ruang pengguna.
Arpith
Jadi jalankan 99 instance di bawah satu supervisor dan jalankan ke-100 di terminal. Saya mengakui bahwa Anda mungkin dapat menonton 100 terminal secara bersamaan, jika demikian, saya terkesan.
msw

Jawaban:

46

Seperti yang sudah disarankan mavillan, cukup gunakan terminator . Hal ini memungkinkan untuk menampilkan banyak terminal dengan cara ubin. Saat mengaktifkan fitur penyiaran, Anda dapat memasukkan perintah yang sama secara bersamaan di setiap terminal.

Berikut adalah contoh dengan perintah tanggal yang disiarkan ke jaringan 32 terminal.

terminatorx32

Jlliagre
sumber
3
Sialan ini luar biasa!
Afr
Bagaimana saya bisa dengan mudah membuka 32 terminal?
Annan
6
@Annan Terminator mendukung tata letak khusus, lihat unix.stackexchange.com/a/168445/2594 dan askubuntu.com/a/178242/18306
jlliagre
11

tmux memiliki kemampuan ini. (bersama dengan banyak kemampuan berguna lainnya dalam nada yang sama)

Dapat dilakukan melalui:

:setw synchronize-panes on
Michael Martinez
sumber
Bisakah Anda jelaskan secara singkat bagaimana tmux melakukan itu - atau tempel tautan? Terima kasih!
eli
1
: setw sinkronisasi-panel aktif
Michael Martinez
9

Multixterm

Alat lain untuk ditambahkan ke daftar adalah yang disebut multixterm. Menggunakan xtermterminal. Anda dapat memanggilnya seperti ini:

$ multixterm

Dan sekali Anda akan disajikan dengan GUI.

                                                         ss dari gui

Anda kemudian dapat mulai memutar xtermwindows dengan mengklik new xtermtombol. Di sini sebagai contoh saya telah memohon 2. Jika Anda kemudian klik pada jendela utama, Anda dapat mulai mengetik perintah di kedua jendela secara bersamaan:

   ss dari xtems

siaran keyboard

Tampaknya hanya tersedia di Ubuntu, terlihat mirip dengan multixterm.

kutipan

Tujuan dari keyboardcast adalah untuk memungkinkan Anda mengirim penekanan tombol ke beberapa X windows sekaligus. Ini memungkinkan Anda, misalnya, untuk mengontrol sejumlah terminal yang terhubung ke host yang berbeda tetapi serupa untuk keperluan administrasi massal.

Anda juga dapat memilih non-terminal. Jika Anda datang dengan penggunaan yang masuk akal untuk kemampuan ini saya akan tertarik mendengarnya.

Program ini dapat memilih jendela untuk dikirim dengan mencocokkan judulnya (menggunakan substring) atau dengan mengkliknya (dalam metode yang mirip dengan fitur tangkapan layar GIMP).

Program ini juga menampilkan kemampuan untuk memunculkan beberapa instance gnome-terminal yang mengeksekusi satu perintah pada banyak argumen (misalnya mengeksekusi 'ssh' pada beberapa host). Terminal gnome dipanggil dengan profil 'keyboardcast' jika ada (jadi, misalnya, ukuran font Anda bisa lebih kecil).

slm
sumber
penjaga! Catatan diambil.
runlevel0
Tampaknya keyboardcast rusak, dan ini mengecewakan.
RJ
8

Anda dapat melakukan sesuatu seperti:

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

Atau jika output dari setiap perintah relevan selama eksekusi, Anda dapat mengatur layar.

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

Layar membutuhkan lebih banyak pekerjaan manual.

BitsOfNix
sumber
Bisakah Anda memperluas lebih lanjut pada solusi layar? Lebih sesuai dengan apa yang saya inginkan ...
Arpith
mengapa tidak hanya tail -ffile log daripada menyiapkan seratus layar.
Lie Ryan
@Argith layar memunculkan beberapa terminal dalam satu terminal. Jika Anda ingin melihat semuanya dalam "waktu nyata" maka Anda dapat menggunakan layar. Meskipun secara pribadi saya akan menggunakan file log, Anda dapat mengatur prog Anda untuk mengirim pesan atau benar-benar memiliki prog Anda sendiri yang menulis file log untuk setiap contoh (mis: myprog.pid.log)
BitsOfNix
@ LieRyan karena kecuali Anda login dengan sesuatu seperti syslog Anda harus login ke file terpisah untuk setiap proses. Jika Anda hanya mencoba untuk memiliki 20+ proses menulis ke file yang sama pada saat yang sama Anda akan memiliki waktu yang buruk.
Sammitch
@Sammitch:tail -f *.log
Lie Ryan
5

Saya pengguna KDE, dengan konsole 2.13.2 di KDE 4.13.3 Anda dapat melakukan ini:

  1. buka konsole

  2. tampilan split secara vertikal masukkan deskripsi gambar di sini

  3. tulis secara bersamaan di setiap terminal di dalam jendela masukkan deskripsi gambar di sini

nulll
sumber
4

Coba Terminator (terminal emulator). Itu dapat memiliki banyak sesi shell di jendela yang sama dan Anda dapat menyiarkan perintah kepada mereka semua.

Terminator

mavillan
sumber
3

Anda bisa menggunakan alat seperti MobaXterm dan itu akan memungkinkan Anda untuk terhubung secara bersamaan dan kemudian menempelkan perintah Anda ke semua jendela Anda.

pengguna46436
sumber
Bukan Linux yang terkait, seperti mobaxterm, yang sangat mengesankan untuk apa yang dilakukannya, hanya Windows dan pertanyaannya jelas tentang solusi Linux.
RJ
3

Jika Anda hanya ingin melihat output dari eksekusi program ke-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
John B
sumber
2

Anda dapat mengontrol konsolemelalui DCOP. Contohnya adalah dari sini :

#!/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.
Aaron D. Marasco
sumber
2
sh <<-STRESS & 
$( printf 'myprog &\n%.0b' \
    `seq 1 ${MAX_CONCURRENT_PROCS}` )
STRESS
echo "$!"

Saya setuju dengan komentar yang dibuat @msw di atas. Ini akan menulis kepada Anda skrip yang akan diluncurkan oleh shproses berlatar belakang dan mencetak shpid proses anak sehingga Anda dapat memonitornya dan anak-anaknya saat berfungsi.

mikeserv
sumber
2

@Jinpeng berada di jalur yang benar dengan GNU Parallel , hanya saja bukan implementasinya.

Contoh: Jalankan 10 instance paralel dari program Anda, dengan setiap utas menjalankan program Anda hanya sekali:

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

Contoh: Jalankan 10 utas paralel, dengan masing-masing utas tersebut menjalankan program Anda tanpa batas:

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

Anda dapat dengan mudah mengatur skala ini ke ratusan utas dengan mengganti 10dalam contoh saya.

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

Jika program Anda menghasilkan pesan stdout apa pun dan Anda ingin melihatnya saat dihasilkan (daripada default yang menyusunnya), --ungroupopsi untuk paralel mungkin berguna.

parallel --ungroup   ...

Jika Anda menjalankan banyak utas dari workstation Anda dan tidak ingin semuanya menjadi tidak responsif, pertimbangkan niceseluruh proses subtree pada waktu peluncuran.

nice -n19 parallel   ...

Side catatan, GNU Parallel biasanya tidak terinstal secara default tapi biasanya dalam paket repo normal Anda, jadi hanya menginstalnya seperti paket lain: dnf install parallel, apt-get install parallel, brew install parallel, dll

Joshua Huber
sumber
1

Anda dapat memulai proses di latar belakang dengan nohup.

Contoh:

nohup ./myprog -arg1 -arg2 &

Keluaran:

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

Ingatlah untuk membunuh tugas nanti dengan yang diberikan PID:

kill 1769

Untuk membawa proses di latar depan Anda harus memasukkan nomor pekerjaan, dalam hal ini [1]:

fg %1
TaXXoR
sumber
1

gnu parallel persis alat yang Anda cari. parallel -j 9 yourcommand

Jingpeng Wu
sumber
0

Little to mill:

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

Akan membuat terminator config (istilah tata letak) untuk banyak jendela dalam satu grup.

EDIT: Setidaknya, terminator dapat mengirim siaran ke setiap terminal dalam grup yang sama. Fungsi ini dapat diubah - sehingga Anda dapat mengaktifkannya menulis 'su -' kemudian menonaktifkan dan menulis kata sandi ke terminal onces dan mengaktifkannya lagi.

Marek
sumber
1
Apakah lebih baik? Maafkan saya bahasa Inggris yang tidak enak :)
Marek